Problem bei Verarbeitung einer XML-Datei

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Boris
Beiträge: 19
Registriert: Mo 1. Okt 2007, 21:57
OS, Lazarus, FPC: Linux: KDE Neon, Sparky - akt. Lazarus stable, FPC 3.0.2
CPU-Target: 32/64Bit
Wohnort: Rommerskirchen, NRW

Problem bei Verarbeitung einer XML-Datei

Beitrag von Boris »

Hallo zusammen,

nachdem ich nun langsam verzweifele, die XML-Beispiele auf der Lazarus-Seite funktionieren irgendwie mit der hier vorliegenden Datei nicht, dachte ich, dass
ihr mir evtl. einen Tipp geben könnt.

Zunächst habe ich mit folgendem Code versucht, an die ersten Knoten der angehängten XML-Datei heranzukommen:

Code: Alles auswählen

ReadXMLFile(Doc, 'tmp\Auswertung.xml');
     Statusnode := Doc.DocumentElement.FindNode('status');
 
     //Das klappt und es wird korrekt ein Wert von 6 zurück geliefert,
    //da es weitere 6 Unterknoten gibt.
     j := statusnode.ChildNodes.count;
     debugln(inttostr(j));
 
     Filmnode := Statusnode.Findnode('rcode');
     a := Filmnode.NodeValue;
     //Das Ergebnis hier sollte = 0 sein 
     debugln(a);
     //in der Konsole wird aber nichts ausgegeben.
Ich komme einfach nicht weiter. Die weiteren Knoten kann ich mit FindNodes finden - der Compiler beschwert sich nicht, sobald ich aber an die
Werte heranzukommen versuche, erhalte ich ein disjunktes Ergebnis.

Vielleicht habe ich auch noch nicht so ganz verstanden, wie mit XML-Dateien zu verfahren ist, hier wäre ich sehr an weiterführenden Infos interessiert.
Vielen Dank für eure Aufmerksamkeit und TIA für sachdienliche Hinweise.

P. S. Wer sich jetzt fragt, wozu ich das ganze brauche: ich tüftele gerade an einer kleinen DVD-Verwaltung um mich wieder in Pascal einzuarbeiten. Ich war durch die VB bzw. VB.Net Verlockungen etwas auf abwegen. :oops:
Auswertung.xml
Betreffende "Problemdatei".
(592 Bytes) 126-mal heruntergeladen

df.id
Beiträge: 20
Registriert: Fr 23. Mai 2008, 00:29
OS, Lazarus, FPC: Windows|Linux (L 3.8.0 FPC 3.2.2)
CPU-Target: Intel
Wohnort: Münster
Kontaktdaten:

Re: Problem bei Verarbeitung einer XML-Datei

Beitrag von df.id »

Hallo!

Filmnode.NodeValue ist nicht das, was Du suchst. Das Element selbst hat hier keinen Wert.
Du musst noch eine Stufe tiefer gehen. Du willst den Text des xml-Elementes lesen.
Der Text ist ein spezielles Attribut vom Typ TEXT_NODE und ist damit wieder ein Child vom Filmnode.

Das kann man etwa so machen:

Code: Alles auswählen

p:=Filmnode.firstchild;
 while p<>NIL do begin
  if p.NodeType=TEXT_NODE then
   Result:=p.NodeValue;
  p:=p.NextSibling;
 end;
In Deiner Beispieldatei wird firstchild immer bereits den Text finden. Aber korrekter ist es, alle Child zu prüfen.

VG
Dirk

P.S.: wenn's kompiziert wird, hilft xpath (EvaluateXPathExpression, fcl unit xpath), aber das ist wieder eine neue Sprache.

Boris
Beiträge: 19
Registriert: Mo 1. Okt 2007, 21:57
OS, Lazarus, FPC: Linux: KDE Neon, Sparky - akt. Lazarus stable, FPC 3.0.2
CPU-Target: 32/64Bit
Wohnort: Rommerskirchen, NRW

Re: Problem bei Verarbeitung einer XML-Datei

Beitrag von Boris »

Vielen Dank df.id,

du hast mich schon ein großes Stück weiter gebracht. Ein wenig anpassen musste ich deinen Codeschnipsel noch, denn mit der Bedingung, nur etwas zu tun, falls es sich um einen Text_Node handelte, brachte in der inneren Schleife kein Ergebnis.

Falls jemand anderes ebenfalls auf der Suche ist, hier der Code, wie er jetzt bei mir funktioniert hat:

Code: Alles auswählen

ReadXMLFile(Doc, 'tmp\Auswertung.xml');
Statusnode := Doc.DocumentElement.FindNode('status');
p := Statusnode.FirstChild;
while p <> NIL do
begin
       //if p.NodeType=Text_Node then
       memo2.lines.add(p.NodeName + ' = ' + p.FirstChild.NodeValue);
       p := p.NextSibling;
end;

Antworten