![]() |
XML Einlesen
Hallo,
habe folgendes problem mit dem einlesen von xml dateien und komme da irgendwie nicht weiter. Beide (Kopf) werden korrekt eingelesen. Positionen nimmt er grundsätzlich nur die von dem ersten Kopf ?! kann mir jemand einen entscheidenen hinweis geben? sicherlich nur eine kleinigkeit, aber ich komme nicht drauf :-( Nachfolgend die XML-Datei
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<XML-Orders> <Kopf> <Kontonummer>10001</Kontonummer> <Name>Kunde1</Name> <Strasse>Hauptstrasse 22</Strasse> <POSITION> <PosNr>001</PosNr> <ArtikelNr>4711</ArtikelNr> <Artikelbezeichnung>Artikel1</Artikelbezeichnung> </POSITION> <POSITION> <PosNr>002</PosNr> <ArtikelNr>4712</ArtikelNr> <Artikelbezeichnung>Artikel2</Artikelbezeichnung> </POSITION> <POSITION> <PosNr>003</PosNr> <ArtikelNr>4713</ArtikelNr> <Artikelbezeichnung>Artikel3</Artikelbezeichnung> </POSITION> <POSITION> <PosNr>004</PosNr> <ArtikelNr>4714</ArtikelNr> <Artikelbezeichnung>Artikel4</Artikelbezeichnung> </POSITION> <POSITION> <PosNr>005</PosNr> <ArtikelNr>4715</ArtikelNr> <Artikelbezeichnung>Artikel5</Artikelbezeichnung> </POSITION> <POSITION> <PosNr>006</PosNr> <ArtikelNr>4716</ArtikelNr> <Artikelbezeichnung>Artikel6</Artikelbezeichnung> </POSITION> </Kopf> <Kopf> <Kontonummer>10002</Kontonummer> <Name>Kunde2</Name> <Strasse>Schulstrasse 40</Strasse> <POSITION> <PosNr>001</PosNr> <ArtikelNr>4717</ArtikelNr> <Artikelbezeichnung>Artikel7</Artikelbezeichnung> </POSITION> <POSITION> <PosNr>002</PosNr> <ArtikelNr>4718</ArtikelNr> <Artikelbezeichnung>Artikel8</Artikelbezeichnung> </POSITION> <POSITION> <PosNr>003</PosNr> <ArtikelNr>4719</ArtikelNr> <Artikelbezeichnung>Artikel9</Artikelbezeichnung> </POSITION> </Kopf> </XML-Orders> Nachfolgend mein Code:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var Doc: IXMLDocument; Data: IXMLNode; Node: IXMLNode; I, E: Integer; begin Memo2.Clear; Doc := LoadXMLDocument('test.xml'); Data := Doc.DocumentElement; for I := 0 to Data.ChildNodes.Count-1 do begin Node := Data.ChildNodes[I]; if Node.NodeName = 'Kopf' then begin Memo2.Lines.Add(Node.ChildNodes['Kontonummer'].NodeValue); Memo2.Lines.Add(Node.ChildNodes['Name'].NodeValue); Memo2.Lines.Add(Node.ChildNodes['Strasse'].NodeValue); //Positionen anfang Node := Doc.DocumentElement.ChildNodes['Kopf'].ChildNodes['POSITION']; while Assigned(Node) do begin Memo2.Lines.Add(Node.ChildNodes['PosNr'].NodeValue); Memo2.Lines.Add(Node.ChildNodes['ArtikelNr'].NodeValue); Memo2.Lines.Add(Node.ChildNodes['Artikelbezeichnung'].NodeValue); Node := Node.NextSibling; end; //Positionen ende end; end; end; Nachfolgend mein (falsches) ergebnis:
Code:
10001
Kunde1 Hauptstrasse 22 001 4711 Artikel1 002 4712 Artikel2 003 4713 Artikel3 004 4714 Artikel4 005 4715 Artikel5 006 4716 Artikel6 10002 Kunde2 Schulstrasse 40 // ab hier liest er wieder nur die zu dem ersten Kopf gehörigen Positionen ein ? 001 4711 Artikel1 002 4712 Artikel2 003 4713 Artikel3 004 4714 Artikel4 005 4715 Artikel5 006 4716 Artikel6 |
AW: XML Einlesen
Du weist der Variablen Node ja 3 mal neue Knoten zu, und das in 2 verschachtelten Schleifen. Benutz doch lieber mehrere Variablen, durch die "Kopf"-Knoten kannst Du ja ab dem ersten mit NextSibling iterieren und für die Kindknoten dann weitere Variablen belegen.
|
AW: XML Einlesen
Zitat:
Klar, du nimmst ja auch immer nur die Nodes vom ersten 'Kopf'. :wink: also
Delphi-Quellcode:
Doc.DocumentElement.ChildNodes[i].ChildNodes['POSITION'];
bzw.
Delphi-Quellcode:
, weil
Node.ChildNodes['POSITION'];
Delphi-Quellcode:
Node := Data.ChildNodes[I];
|
AW: XML Einlesen
:oops:
Vielen Dank, das war es natürlich. Manchmal sieht man den Wald vor lauter Bäumen nicht :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz