Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Verschachtelung korrekt auslesen (https://www.delphipraxis.net/12310-verschachtelung-korrekt-auslesen.html)

tekkyeah 24. Nov 2003 22:08


Verschachtelung korrekt auslesen
 
Hallo zusammen, ich habe eine XML Datei mit nachfolgendem (verkürzt dargestellten) Aufbau. Diese möchte ich gerne einlesen... Prinzipiell besteht meine Datei aus "ordersätzen", die den Kunden beinhalten und dann die von ihm bestellten Produkte.

XML-Code:
<orders_all>
- <orders>
  <customers_name>tekkyeah</customers_name>
  <customers_company />
  <customers_city>Bremen</customers_city>
  ...
  - <products>
    <orders_id>27</orders_id>
    <products_id>3407</products_id>
    <products_model>RC 80X120M/I</products_model>
    </products>
  - <products>
    <orders_id>27</orders_id>
    <products_id>209</products_id>
    <products_model>ANT 20X30M</products_model>
    </products>
  </orders>
</orders_all>
Ich habe mir die tlb in mein Delphi 5 Professional importiert und kann auf die XML-Datei zugreifen... die Kundeninformationen kann ich einlesen, aber wie bekomme ich die nächste Ebene eingelesen mit "products" ? Genauer gefragt... an welcher Stelle lese ich die die nodes für die "products" ein, analog der Zeile

"orders := xmlDoc.documentElement.selectNodes('orders');"

Auszug aus meinem Code...


Delphi-Quellcode:
 
  xmlDoc := CoDOMDocument30.Create;
  (...)

  orders := xmlDoc.documentElement.selectNodes('orders');
  for i:=0 to orders.length - 1 do
  begin
    try
      subNode := orders.item[i].selectSingleNode('customers_name');
      (...)
    except
    end;
    try
      subNode := orders.item[i].selectSingleNode('customers_company');
      (...)
    except
    end;
    try
      subNode := orders.item[i].selectSingleNode('customers_city');
      (...)
    except
    end;
    products := xmlDoc.documentElement.selectNodes('products');
    for j:=0 to products.length - 1 do
    begin
      try
        subNode := products.item[j].selectSingleNode('orders_id');
      except
      end;
      try
        subNode := products.item[j].selectSingleNode('products_id');
      except
      end;
      try
        subNode := products.item[j].selectSingleNode('products_model');
      except
      end;
    end;
    (...)
Ich hoffe, mein Problem ist klar geworden... sicher ganz leicht zu lösen... nur ich komme nicht drauf... theoretisch könnte es ja noch weitergehende VErschachtelungen im Document geben, also ist meine primäre Frage: Wie greife ich auf unterliegende Ebenen zu...

Hoffe auch eine tolle Antwort...

Gruß
Holger

tekkyeah 25. Nov 2003 09:11

Re: Verschachtelung korrekt auslesen
 
ok ok...
habe mich nochmal eingehend mit dem xml-sdk beschäftigt und herausgefunden, wie ich auf tieferliegende Strukturen zugreifen kann... ziemlich einfach, wenn man es weiß...

Delphi-Quellcode:
products := xmlDoc.documentElement.selectNodes('orders/products');
Theoretisch kann ich damit leben, aber ich habe noch immer eine Frage dazu...
Wenn ich die obige Source verwende, dann enthält die Variable products ja alle Einträge aus dem gesamten Dokument und ich will ja nur die Einträge haben, die direkt unterhalb des gerade aktiven "orders" sind... kann ich das irgendwie direkt mit einer Routine abfangen ?

Gruß
Holger

choose 25. Nov 2003 09:22

Re: Verschachtelung korrekt auslesen
 
Hallo tekkyeah,

zunächst einmal herzlich willkommen bei Delphi-PRAXiS!

Wenn ich Dich richtig verstanden habe, Suchst Du nach einer Möglichkeit, bestimmte (verschachtelte) Knotenmengen innerhalb einer XML-Quelle zu ermitteln. Mit der konkreten Implementierung, die Du erwähnst, habe ich zwar noch nicht gearbeitet, die universelle Sprache (nach der Deine erste Lösung ebenfalls aussieht) für Probleme dieser Art heißt im Zusammenhang mit XML allerdings XPath.

Nachdem Du Dich vergewissert hast, das Deine Routinen mit der Syntax dieser Sprache arbeiten, solltest Du unter Bei Google suchenxpath tutorial fündig werden.

sakura 25. Nov 2003 09:28

Re: Verschachtelung korrekt auslesen
 
Hi tekkyeah und erst einmal herzlich willkommen in der DP,

nun zu Deinem Problem. Vorweg :mrgreen: möchte ich Dir noch empfehlen des neuere MS XML 4 zu nutzen, suche einfach mal in der DP nach Hier im Forum suchenCoDOMDocument40.

In beiden kannst Du aber XSL über Bedingunge defninieren. Damit geht die Abfrage dann z.B. wie folgend:

Delphi-Quellcode:
products := xmlDoc.documentElement.selectNodes('orders[customers_name="tekkyeah"]/products');
for I := 0 to Pred(products.length) do
  ShowMessage(products[i].text);
Solltest Du Attribute nutzen, dann sähe obiges Beispiel wie folgend aus:

Delphi-Quellcode:
products := xmlDoc.documentElement.selectNodes('orders[@customers_name="tekkyeah"]/products');
for I := 0 to Pred(products.length) do
  ShowMessage(products[i].text);
Suche im SDK mal nach dem Thema "XSL Pattern Samples", da findest Du die gängisten Abfragen und Kombinationen. Ich haben dieses Kapitel am Anfang als mein XML-Mekka angesehen ;-)

...:cat:...

tekkyeah 25. Nov 2003 09:48

Re: Verschachtelung korrekt auslesen
 
Hi sakura, hi choose,

vielen vielen vielen Dank für die schnelle und tolle Antwort. :mrgreen: :mrgreen:
Ich habe genau danach

Delphi-Quellcode:
products := xmlDoc.documentElement.selectNodes('orders[customers_name="tekkyeah"]/products');
for I := 0 to Pred(products.length) do
  ShowMessage(products[i].text);
gesucht... momentan arbeite ich mit MSXML3... prinzipiell spricht aber auch nix gegen den Einsatz von Version 4... aber was muss ich dann alles für meinen Kunden bereitstellen (als Install), damit das bei ihm auch funktioniert ? Wenn er XP hat, sollte er ja schon aktuell sein, aber bei NT oder Win2000 wohl eher nicht... muss ich dann nicht die dazugehörigen DLLs registrieren ?

Das Thema "XSL Pattern Samples" im SDK werde ich mir mal zu Gemüte führen... bin eigentlich immer Autodidakt gewesen und werde es schon begreifen :lol:

Gruß
Holger

sakura 25. Nov 2003 10:06

Re: Verschachtelung korrekt auslesen
 
Zitat:

Zitat von tekkyeah
Wenn er XP hat, sollte er ja schon aktuell sein, aber bei NT oder Win2000 wohl eher nicht... muss ich dann nicht die dazugehörigen DLLs registrieren ?

Hm, ich hätte das auch gedacht, aber selbst Windows 2003! wird standardmäßig noch mit dem MS XML 3 ausgeliefert. Den 4er gibt es seit 2001! Der ist um weites flexibler, schneller und resourcenschonender. Du kannst das MSI-Installer Packet unter www.microsoft.com/xml runterladen. Auch als Beipaket für eigene Installationen.

Viel Erfolg mit dem XML DOM. Ich arbeite seit Febr. 2000 damit - auch selbst gebracht ;-)

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 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