AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

XML Einlesen

Ein Thema von CVi · begonnen am 8. Jul 2020 · letzter Beitrag vom 8. Jul 2020
Antwort Antwort
CVi

Registriert seit: 21. Nov 2010
15 Beiträge
 
#1

XML Einlesen

  Alt 8. Jul 2020, 11:59
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 = 'Kopfthen
    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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: XML Einlesen

  Alt 8. Jul 2020, 12:05
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#3

AW: XML Einlesen

  Alt 8. Jul 2020, 12:27
Zitat:
Doc.DocumentElement.ChildNodes['Kopf'].ChildNodes['POSITION'];

Klar, du nimmst ja auch immer nur die Nodes vom ersten 'Kopf'.

also Doc.DocumentElement.ChildNodes[i].ChildNodes['POSITION'];

bzw. Node.ChildNodes['POSITION']; , weil Node := Data.ChildNodes[I];
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
CVi

Registriert seit: 21. Nov 2010
15 Beiträge
 
#4

AW: XML Einlesen

  Alt 8. Jul 2020, 12:49

Vielen Dank,

das war es natürlich.

Manchmal sieht man den Wald vor lauter Bäumen nicht
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:43 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