Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   XML Einlesen (https://www.delphipraxis.net/204863-xml-einlesen.html)

CVi 8. Jul 2020 11:59

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

DeddyH 8. Jul 2020 12:05

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.

himitsu 8. Jul 2020 12:27

AW: XML Einlesen
 
Zitat:

Delphi-Quellcode:
Doc.DocumentElement.ChildNodes['Kopf'].ChildNodes['POSITION'];


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:
Node.ChildNodes['POSITION'];
, weil
Delphi-Quellcode:
Node := Data.ChildNodes[I];

CVi 8. Jul 2020 12:49

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 12:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz