Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Wie XML Rückgabe aus post weiterverarbeiten (https://www.delphipraxis.net/140338-wie-xml-rueckgabe-aus-post-weiterverarbeiten.html)

p.sprick 16. Sep 2009 10:10


Wie XML Rückgabe aus post weiterverarbeiten
 
Hallo Leute,
ich bekomme von von einem idhttp1.post folgendes xml zurück:
Delphi-Quellcode:
  <?xml version="1.0" encoding="iso-8859-1" ?>
- <CATEGORIES>
  - <CATEGORIES_DATA>
     <ID>8</ID>
     <PARENT_ID>0</PARENT_ID>
     - <NAMES>
       - <NAMEENTRY>
           <LANGUAGEID>1</LANGUAGEID>
           <NAME>Kategorie 8</NAME>
         </NAMEENTRY>
       - <NAMEENTRY>
           <LANGUAGEID>2</LANGUAGEID>
           <NAME>Kategorie 8</NAME>
         </NAMEENTRY>
       </NAMES>
    </CATEGORIES_DATA>
  - <CATEGORIES_DATA>
     <ID>9</ID>
     <PARENT_ID>0</PARENT_ID>
     - <NAMES>
       - <NAMEENTRY>
           <LANGUAGEID>1</LANGUAGEID>
           <NAME>Kategorie 9</NAME>
         </NAMEENTRY>
       - <NAMEENTRY>
           <LANGUAGEID>2</LANGUAGEID>
           <NAME>Kategorie 9</NAME>
         </NAMEENTRY>
       </NAMES>
    </CATEGORIES_DATA>
  </CATEGORIES>
Ich will folgende davon werte in eine Datenbank schreiben:
ID,Language,Name
8,0,Kategorie 8
8,1,Kategorie 8
....
Wenn ich die xml in einen FileStream speicher und in ein xmlDocument lade kann ich schon mal
so die ID rankommen
Delphi-Quellcode:
xmlDocument1.loadfromstream(FileStream);
  with XMLDocument1.DOMDocument as IDOMNodeSelect do
          begin
            xPath := '/CATEGORIES/CATEGORIES_DATA/ID';
            dl := selectNodes(xPath);
            for i := 0 to Pred(dl.length) do
            begin
              dn := dl.item[i] as IDOMNodeEx;
              Memo1.Lines.add('Kategorie: '+ string(dn.Text));
            end;
  end;
Ausgabe also

Kategorie 8
Kategorie 9
Wie komme ich an die andere Daten ? Inner Schleife subnodes ?
Ich wollte eigentlich mit der MSXML arbeiten aber das scheiterte schon beim

xmldoc.Loadxml(filename) Fehler -1072896682

Wer kann helfen ?

Gruss Paul

himitsu 16. Sep 2009 10:24

Re: Wie XML Rückgabe aus post weiterverarbeiten
 
bei mir (Hier im Forum suchenhimXML) würde es so gehn und ich bin mir sicher, daß XPath da auch eine ähnliche Möglichkeit für einen Index anbietet
Zitat:

CATEGORIES/CATEGORIES_DATA[0]/ID
CATEGORIES/CATEGORIES_DATA[1]/ID

p.sprick 16. Sep 2009 10:38

Re: Wie XML Rückgabe aus post weiterverarbeiten
 
Hallo,
ich habe Delphi 6 und habe schon versucht himxml zu installieren!
Bin aber gescheitert. Kann ich es für delphi 6 verwenden?

Gruss Paul

himitsu 16. Sep 2009 10:54

Re: Wie XML Rückgabe aus post weiterverarbeiten
 
Aktuell nicht und ich weiß noch nicht, wie weit ich es im Funktionsumfang und bei den genuzten Funktionen zurückschrauben kann ... bin grad am umbauen und wenn es gut läuft, hab ich schon aufgrund von Anfragen geplant dann auch eine "abgespeckte" Version rauszubringen.

Aber wie gesagt, XPath sollte etwas für die Angabe eines Index bieten.


http://de.wikipedia.org/wiki/XPath
bei XPath scheint der Index genauso angegeben zu werden, also versuch es einfach mal so
Delphi-Quellcode:
for i := 0 to Pred(dl.length) do
begin
  xPath := Format('/CATEGORIES/CATEGORIES_DATA[%d]/ID', [i]);
  dl := selectNodes(xPath);
obwohl ich eigentlich erwartet hätte, daß dein Code auch geht :gruebel:

p.sprick 16. Sep 2009 11:05

Re: Wie XML Rückgabe aus post weiterverarbeiten
 
Hallo Himitsu,
also an die ID´s komme ich ja ran !!!
Funktioniert einwandfrei mit meinem Code!!!

Ich will aber noch an die dazugehörigen "Name" und "LANGUAGEID" komen
wird wohl mit einer inneren Schleife gehen aber ich weiss nicht wie!!

Gruss Paul

himitsu 16. Sep 2009 11:36

Re: Wie XML Rückgabe aus post weiterverarbeiten
 
nja, daas wäre dann das gleiche

direkt

'/CATEGORIES/CATEGORIES_DATA[%d]/NAMES/NAMEENTRY[%d]/LANGUAGEID'

oder getrennt

'/CATEGORIES/CATEGORIES_DATA[%d]' und von da 'NAMES/NAMEENTRY[%d]/LANGUAGEID'

oder über deinen bisherigen Weg

'/CATEGORIES/CATEGORIES_DATA' + .item[i] und von da 'NAMES/NAMEENTRY' + .item[i] dann weiter mit 'LANGUAGEID'

p.sprick 16. Sep 2009 12:18

Re: Wie XML Rückgabe aus post weiterverarbeiten
 
Hallo,
Super ich komme weiter !
Habe das jetzt so gemacht:
Delphi-Quellcode:
with XMLDocument1.DOMDocument as IDOMNodeSelect do
          begin
            xPath := '/CATEGORIES/CATEGORIES_DATA/ID';
            dl := selectNodes(xPath);
            for i := 0 to Pred(dl.length) do
            begin
              dn := dl.item[i] as IDOMNodeEx;
              Memo1.Lines.add('Kategorie: '+ string(dn.Text);
              xpath := Format('/CATEGORIES/CATEGORIES_DATA[%d]/NAMES/NAMEENTRY/LANGUAGEID',[i]);
              dl1:= selectNodes(xPath);
              for j:= 0 to pred(dl1.length) do begin
                dn := dl1.item[j] as IDOMNodeEx;
                Memo1.lines.add(string(dn.Text));
              end;
            end;
  end;
Er gibt mir jetzt die Languadid 1+2 auch mit aus.
Da ich jetz aber auch den Name braucht und nicht noch eine Schleife will.
Kann ich nicht die Schleife so Aufbauen
Delphi-Quellcode:
  xpath := Format('/CATEGORIES/CATEGORIES_DATA[%d]/NAMES/NAMEENTRY',[i]);
              dl1:= selectNodes(xPath);
              for j:= 0 to pred(dl1.length) do begin
              ...
              end;
und innerhalb der schleefe direkt auf die atrribut zugreifen?


Gruss Paul

p.sprick 17. Sep 2009 07:52

Re: Wie XML Rückgabe aus post weiterverarbeiten
 
Hallo,
noch ein kleines Problem
Ich habe es jetzt so gemacht:
Delphi-Quellcode:
  with XMLDocument1.DOMDocument as IDOMNodeSelect do
          begin
            xPath := '/CATEGORIES/CATEGORIES_DATA/ID';
            dl := selectNodes(xPath);
            for i := 0 to Pred(dl.length) do
            begin
              dn := dl.item[i] as IDOMNodeEx;
              Memo1.Lines.add('Kategorie: '+ string(dn.Text));
              xpath := Format('/CATEGORIES/CATEGORIES_DATA[%d]/NAMES/NAMEENTRY',[i]);
              dl1:= selectNodes(xPath);
              for j:= 0 to pred(dl1.length) do begin
                dn := dl1.item[j] as IDOMNodeEx;
                Memo1.lines.add(string(dn.Text));
              end;
            end;
  end;
Die Ausgabe ist jetzt :

Kategorie: 8
1 Kategorie 8
2 Kategorie 8
Kategorie: 9
1 Kategorie 9
2 Kategorie 9

Ich möchte aber in der inneren Schleife auf die Attribute LANGUAGEID und NAME einzeln
zugreifen.
Geht es nicht irgendwie über dn.attributes.attributesbyname([NAME]) oder
dn.attributes[1].value oder ähnlich?

Wer weiss es ?

Gruss Paul

himitsu 17. Sep 2009 09:16

Re: Wie XML Rückgabe aus post weiterverarbeiten
 
also eigentlich müßte es gehn


hab mich grad mal etwas durchgewurschtelt
selectNodes liefert eine IDOMNodeList
IDOMNodeList.item (default) gibt dir einen IDOMNode
IDOMNode bietet ein Property .attributes
attributes ist eine IDOMNamedNodeMap
und IDOMNamedNodeMap bietet wiederum die Funktion getNamedItem


müßte also etwa so aussehn? :gruebel:
Delphi-Quellcode:
dl := selectNodes(xPath);
value := dl[i].attributes.getNamedItem(name);

p.sprick 17. Sep 2009 10:02

Re: Wie XML Rückgabe aus post weiterverarbeiten
 
Hallo ,
es geht nicht, sowohl:
memo1.lines.add(dl1[j].attributes.getNamedItem('NAME').nodeValue);
als auch
memo1.lines.add(dn.attributes.getNamedItem('NAME') .nodeValue);

kommen mit einem Zugriffsverletzung wieso ??



Delphi-Quellcode:
             xpath := Format('/CATEGORIES/CATEGORIES_DATA[%d]/NAMES/NAMEENTRY',[i]);
              dl1:= selectNodes(xPath);
              for j:= 0 to pred(dl1.length) do begin
                dn := dl1.item[j] as IDOMNodeEx;
                memo1.lines.add(dl1[j].attributes.getNamedItem('NAME').nodeValue);
                Memo1.lines.add(string(dn.Text));
              end;
Gruss Paul


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 Uhr.
Seite 1 von 2  1 2      

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