[XML&Delphi] Invalid Variant Operation?

0

Greetings,
Mam pewien ciekawy problem. Otóż podczas próby odczytania kilku atrybutów jednocześnie z pewnego pliku xml, LocalName wyświetla mi się prawidłowo, lecz rzecz mniej ciekawie ma się w przypadku odczytywania właśnie poszczególnych atrybutów. Poniżej zamieszczam fragment kodu-pętli, która odpowiedzialna jest za wyświetlanie informacji w sposób następujący:

  1. W ListBoxie wyświetlać ma ona poszczególne LocalName'y elementów potomnych.
  2. W kilku Editach wyświeltać ma poszczególne Atrybuty elementów potomnych.
for i := 0 to XML.DocumentElement.ChildNodes.Count-1 do
BEGIN
edNazwaWyswietlana.Text:=XML.DocumentElement.ChildNodes[memo1.Itemindex].LocalName;
edNazwaPelna.Text:=XML.DocumentElement.ChildNodes[memo1.Itemindex].Attributes['NP'].Text;
edKonto.Text:=XML.DocumentElement.ChildNodes[memo1.Itemindex].Attributes['konto'].Text; 

//Pętla używając Indeksu klikniętego itema w ListBoxie(Memo1), wyszukuje takiego w pliku XML

end;

No i problem polega na tym, iż LocalName'y elementów potomnych wyświetlane są w ListBoxie bez najmniejszych zgrzytów, lecz niestety z atrybutami nie jest tak wesoło. Otrzymuję bardzo nieprzyjemną informację, iż miała miejsce "Invalid Variant Operation". A teraz, żeby było ciekawiej, przedstawię dwa różne sposoby zapisu, które testowałem w pliku XML:

SPOSÓB 1:

<?xml version="1.0" encoding="UTF-8"?>
<Kontrahenci>
	<Sample1 NP="Nazwa Pelna Sample1" konto="546541 1548 4444444"/>
</Kontrahenci>

Ten sposób, żeby było śmieszniej, jest odczytywany przez mój program w powyżej przedstawiony sposób BEZPROBLEMOWO.

Natomiast, jeśli zastosuję...
SPOSÓB 2:

<?xml version="1.0" encoding="UTF-8"?>
<Kontrahenci>
<Sample2><NP>Sample 2 Pelna</NP><konto>00 0000 2222222</konto></Sample2>
</Kontrahenci>

... pojawia się problem, który poruszyłem na początku swego Topicu. Oczywiście, sposób zapisu nr 1 jest lepszy, czytelniejszy i zajmuje mniej miejsca. Rzecz w tym, że za żadne skarby nie jestem w stanie użyć takiego formatu programowo, gdyż domyślny parser-komponent z Delphi7 zapisuje wartości w sposób nr 2. Cóż zatem mam zrobić? Zmienić parser czy jest może jakieś inne rozwiązanie?

0

Raczej nie ten dział. Jak ktoś z modów wpadnie, to proszę przenieść do Delphi/Pascal.

0

Błąd pojawia się dlatego, że w drugim rodzaju dokumentu xml nie masz atrybutów a próbujesz się do nich odwoływać. W tym przypadku powinieneś to robić tak:

XML.DocumentElement.ChildNodes[memo1.Itemindex].ChildNodes['NP'].Text;
XML.DocumentElement.ChildNodes[memo1.Itemindex].ChildNodes['konto'].Text;

zamiast

XML.DocumentElement.ChildNodes[memo1.Itemindex].Attributes['NP'];
XML.DocumentElement.ChildNodes[memo1.Itemindex].Attributes['konto'];

Poza tym bez problemu możesz tworzyć pierwszy rodzaj dokumentów xml (z atrybutami) dostępnym w Delphi 7 komponentem w następujący sposób:

XML.DocumentElement.AddChild('Sample1');
XML.DocumentElement.ChildNodes['Sample1'].Attributes['NP']:='Nazwa Pelna Sample1';
XML.DocumentElement.ChildNodes['Sample1'].Attributes['konto']:='546541 1548 4444444';
0

Potężne dzięki, działa teraz jak należy. A skoro już założyłem topic o XML w Delphi, mam pewne kolejne pytanko. Czy istnieje jakiś sposób, aby zastosować znak spacji w nazwie potomka elementu głównego?

0

W nazwach elementów nie może być spacji. Tak deklaruje specyfikacja XML.

1 użytkowników online, w tym zalogowanych: 0, gości: 1