AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Verschachtelung korrekt auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Verschachtelung korrekt auslesen

Offene Frage von "tekkyeah"
Ein Thema von tekkyeah · begonnen am 24. Nov 2003 · letzter Beitrag vom 25. Nov 2003
Antwort Antwort
tekkyeah

Registriert seit: 24. Nov 2003
27 Beiträge
 
Delphi 2006 Professional
 
#1

Verschachtelung korrekt auslesen

  Alt 24. Nov 2003, 22:08
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
Holger
  Mit Zitat antworten Zitat
tekkyeah

Registriert seit: 24. Nov 2003
27 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Verschachtelung korrekt auslesen

  Alt 25. Nov 2003, 09:11
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ß...

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
Holger
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#3

Re: Verschachtelung korrekt auslesen

  Alt 25. Nov 2003, 09:22
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.
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Verschachtelung korrekt auslesen

  Alt 25. Nov 2003, 09:28
Hi tekkyeah und erst einmal herzlich willkommen in der DP,

nun zu Deinem Problem. Vorweg 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

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
tekkyeah

Registriert seit: 24. Nov 2003
27 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Verschachtelung korrekt auslesen

  Alt 25. Nov 2003, 09:48
Hi sakura, hi choose,

vielen vielen vielen Dank für die schnelle und tolle Antwort.
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

Gruß
Holger
Holger
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Verschachtelung korrekt auslesen

  Alt 25. Nov 2003, 10:06
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

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  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 02:55 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