Durch .xml-Datei navigieren

6. September 2024 08:47

Hallo zusammen,

ich habe eine Codeunit geschrieben mit der ich .xml-Dateien in meine Tabelle importieren kann. Das Ganze klappt soweit auch ganz gut, bis zu einem bestimmten Punkt und zwar dann wenn die Struktur der .xml-Datei "zu komplex" wird. (Dies wird sie im folgenden Beispiel zwar noch nicht, aber ich dachte anhand eines einfach Beispiels kann man es mir eventuell besser erklären...)

Folgende .xml:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<XML_Data>
    <Records>
        <Record>
            <Row_ID>1</Row_ID>
            <First_Name>John</First_Name>
            <Last_Name>Doe</Last_Name>
            <Company_>ABC Corp</Company_>
            <Street_Number>1234</Street_Number>
            <Street_Name>Main St</Street_Name>
            <Suffix_>Apt 101</Suffix_>
            <City_>Springfield</City_>
            <State_>IL</State_>
            <Zip_>62701</Zip_>
            <Area_Code>217</Area_Code>
            <Phone_>5551234</Phone_>
        </Record>
        <Record>
            <Row_ID>2</Row_ID>
            <First_Name>Jane</First_Name>
            <Last_Name>Smith</Last_Name>
            <Company_>XYZ Inc</Company_>
            <Street_Number>5678</Street_Number>
            <Street_Name>Elm St</Street_Name>
            <Suffix_>Suite 200</Suffix_>
            <City_>Chicago</City_>
            <State_>IL</State_>
            <Zip_>60601</Zip_>
            <Area_Code>312</Area_Code>
            <Phone_>5555678</Phone_>
        </Record>
        <Record>
            <Row_ID>3</Row_ID>
            <First_Name>Emily</First_Name>
            <Last_Name>Johnson</Last_Name>
            <Company_>Widget Co</Company_>
            <Street_Number>9101</Street_Number>
            <Street_Name>Oak St</Street_Name>
            <Suffix_>Ste 300</Suffix_>
            <City_>Peoria</City_>
            <State_>IL</State_>
            <Zip_>61602</Zip_>
            <Area_Code>309</Area_Code>
            <Phone_>5559101</Phone_>
        </Record>
    </Records>
</XML_Data>


Also, diese .xml-Datei konnte ich mit meiner Codeunit problemlos importieren bevor ich die Komplexität einfach mal mit einem Knoten "<Records>" erweitert habe. Nun stelle ich mir die Frage, ich im Code mich durch die .xml navigieren muss, um eben wieder an die Daten der "<Record>" -Knoten zu kommen und diese zu importieren.

Mein Code:
Code:
codeunit 50145 "XML Data"
{
    procedure Import()
    var
        InS: InStream;
        FileName: Text;
        XmlDoc: XmlDocument;
        Root: XmlElement;
        Records: XmlNodeList;
        Node: XmlNode;
        Element: XmlElement;
        ElementName: Text;
        Data: record "XML Data";
        Ref: RecordRef;
        FieldRef: FieldRef;
        i: Integer;
    begin
        if UploadIntoStream('Upload XML', '', '', FileName, InS) then
            if XmlDocument.ReadFrom(InS, XmlDoc) then begin
                XmlDoc.GetRoot(Root);
                Records := Root.GetChildElements('Records');
                //Message(Format(Records));
                foreach Node in Records do begin
                    Element := Node.AsXmlElement();
                    // Third One
                    Ref.Open(DATABASE::"XML Data");
                    Ref.Init();
                    for i := 1 to Ref.FieldCount do begin
                        FieldRef := Ref.FieldIndex(i);
                        ElementName := MappingXMLToField(FieldRef.Name);
                        case FieldRef.Type of
                            FieldType::Integer:
                                FieldRef.Value := GetInteger(Element, ElementName);
                            FieldType::Text,
                            FieldType::Code:
                                FieldRef.Value := GetText(Element, ElementName);
                        end;
                    end;
                    Ref.Insert();
                    Ref.Close();
                end;
            end else
                error('Cannot parse XML');
    end;


Es wird ja sicherlich an der Stelle vor meiner foreach-Schleife liegen, aber ich konnte bis jetzt noch keine Lösung finden.


Vielen Dank im Voraus!

Re: Durch .xml-Datei navigieren

9. September 2024 12:12

Die Lösung für mein Problem ist übrigens:
Den Befehl:
Code:
Records := Root.GetChildElements('Records')

zu diesem zu ändern:
Code:
Root.SelectNodes('Records/Record', Records)


Also als ersten Parameter den Pfad den man an Knoten sozusagen geht anzugeben und als zweites die XmlNodeList "Records" als Liste, um mit der Variable dann weiterzuarbeiten.
(In meinem Fall habe ich die Funktion dann mit der Text-Variable "Path" benutzt, um bei Aufruf dann den Pfad anzugeben und die Funktion flexibler nutzen zu können.
-> ist dennoch sehr verfuchst sich so durch komplexere XML-Dateien zu navigieren, also für meinen Anwendungsfall bin ich zwar einen Schritt weiter, aber noch nicht da wo ich sein will...
Vielleicht hat hier ja noch jemand einen aufschlussreichen Beitrag hinzuzufügen :D