[gelöst]: XmlNodeList und ChildNodeList

26. August 2024 13:40

Hallo zusammen,

ein REST-Webservice liefert mir einen XML-Response. Der XML-Response enthält mehrere Rechnungsköpfe und in entsprechender XML-Struktur logisch untergeordnete Rechnungszeilen.

Ich benutze folgendes Codefragment:
Code:
XmlNodeList := XmlDoc.SelectNodes('//MITGLIEDNR');   // Anzahl der Rechnungsköpfe (=ParentNode) ermitteln (Knoten MITGLIEDNR kommt nur einmal je Rechnung vor).
FOR p:= 0 TO XmlNodeList.Count -1 DO BEGIN  // wir durchlaufen die Rechnungsköpfe
    XmlNode := XmlDoc.SelectSingleNode('//key_'+ FORMAT(p) +'/MITGLIEDNR');
    loctxtMglNr := XmlNode.InnerText; //Inhalt des Knotens MITGLIEDNR im ParentNode ermitteln
    ChildNodeList := XmlNode.ChildNodes();  //Kinder des aktuellen ParentNode ermitteln  --> und das geht nicht!

    FOR i := 0 TO ChildNodeList.Count -1 DO BEGIN
      ChildNode := ChildNodeList.ItemOf(i);
      ChildNode := ChildNode.SelectSingleNode('//ARTIKEL');
      MESSAGE(ChildNode.InnerText);
    END;

END;


Erläuterung:
* über SelectSingleNode und einem dynamischen Key (key_*) erreiche ich die einzelnen Rechnungsköpfe (--> SelectSingleNode('//key_'+ FORMAT(p) +'/MITGLIEDNR')) und lege diese in XmlNode ab.
* anschließend möchte ich alle Kinder (= Rechnungszeile) der XmlNode (= Rechnungskopf) durchlaufen.

Problem: über ChildNodeList := XmlNode.ChildNodes(); kann ich zwar auf Kinder von XmlNode zugreifen, allerdings greift er immer auf das erste Kind zu, obwohl ich über XmlNode := XmlDoc.SelectSingleNode('//key_'+ FORMAT(p) +'/MITGLIEDNR'); in den nächsten ParentNode springe (von key_0 in key_1).
Dh ChildNodes ignoriert die Änderung im XmlNode.

Wie kann ich also die Kinder des aktuellen ParentNode ermitteln?

Vielen Dank!
Zuletzt geändert von Ralph71 am 27. August 2024 13:46, insgesamt 1-mal geändert.

Re: Edit: XmlNodeList und ChildNodeList

27. August 2024 13:45

Ich konnte das jetzt mit KI lösen. Eine Besonderheit ist, dass das ParentNode als auch das ChildNode den gleichen Namen haben.
Ansatz:
Code:
PROCEDURE GetParentAndChildNodes@1();
VAR
    XmlDoc@2 : DotNet XmlDocument;
    XmlNodeList@3 : DotNet XmlNodeList;
    XmlNode@4 : DotNet XmlNode;
    ParentNode@5 : DotNet XmlNode;
    ChildNodeList@6 : DotNet XmlNodeList;
    ChildNode@7 : DotNet XmlNode;
BEGIN
    // XML-Dokument laden
    XmlDoc := XmlDoc.XmlDocument;
    XmlDoc.Load('C:\path\to\your\file.xml');

    // Alle 'key_0' Knoten auf der obersten Ebene finden
    XmlNodeList := XmlDoc.SelectNodes('//data/key_0');

    // Durch die Knoten navigieren
    FOR i := 0 TO XmlNodeList.Count - 1 DO BEGIN
        XmlNode := XmlNodeList.Item(i);
        ParentNode := XmlNode.ParentNode;
        MESSAGE('Parent Node Name: %1', ParentNode.Name);

        // Child-Nodes des aktuellen 'key_0' Knotens finden
        ChildNodeList := XmlNode.SelectNodes('key_0');

        // Durch die Child-Nodes navigieren
        FOR j := 0 TO ChildNodeList.Count - 1 DO BEGIN
            ChildNode := ChildNodeList.Item(j);
            MESSAGE('Child Node Name: %1, Value: %2', ChildNode.Name, ChildNode.InnerText);
        END;
    END;
END;