Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Knoten finden (https://www.delphipraxis.net/135979-knoten-finden.html)

Blackbird001 21. Jun 2009 14:47


Knoten finden
 
Hallo vielleicht könnt ihr mir bei einem Problem helfen.

Hier erst einmal der Code

Delphi-Quellcode:
if Knotenliste.Nodes[1].ChildNodes.Nodes[1].NodeName = 'BankAccounts' then
    begin
        Memo1.Lines.Add('************');
        if Knotenliste.Nodes[1].ChildNodes.Nodes[1].ChildNodes[0].HasAttribute('bankName') then begin
        Memo1.Lines.Add(Knotenliste.Nodes[1].ChildNodes.Nodes[1].ChildNodes[0].Attributes['bankName']);
        end;
        Memo1.Lines.Add(Knotenliste.Nodes[1].ChildNodes.Nodes[1].ChildNodes[0].Attributes['bankCode']);
        Memo1.Lines.Add(Knotenliste.Nodes[1].ChildNodes.Nodes[1].ChildNodes[0].Attributes['eban']);
        Memo1.Lines.Add(Knotenliste.Nodes[1].ChildNodes.Nodes[1].ChildNodes[0].Attributes['swift']);
        Memo1.Lines.Add(Knotenliste.Nodes[1].ChildNodes.Nodes[1].ChildNodes[0].Attributes['accountNo']);
        Memo1.Lines.Add(Knotenliste.Nodes[1].ChildNodes.Nodes[1].ChildNodes[0].Attributes['street']);
        Memo1.Lines.Add(Knotenliste.Nodes[1].ChildNodes.Nodes[1].ChildNodes[0].Attributes['zip']);
        Memo1.Lines.Add(Knotenliste.Nodes[1].ChildNodes.Nodes[1].ChildNodes[0].Attributes['city']);
        Memo1.Lines.Add(Knotenliste.Nodes[1].ChildNodes.Nodes[1].ChildNodes[0].Attributes['isoCountryCode']);
        Memo1.Lines.Add('************');

    end;
Die Sache ist, der Knoten BankAccounts befindet sich nicht immer an der selben Stelle, wie kann ich es lösen, das ich rausbekomme ob der Knoten vorhanden ist und an welcher Stelle und wie kann ich dann auf die Attribute zugreifen.

Könnt ihr mir vielleicht ein kleines Beispiel geben.

Vielen Dank.

himitsu 21. Jun 2009 14:53

Re: Knoten finden
 
versuch mal
Delphi-Quellcode:
Knotenliste.Nodes[1].ChildNodes.Nodes['BankAccounts']
außerdem müßte ChildNodes soetwas wie IndexOf kennen

Blackbird001 21. Jun 2009 14:56

Re: Knoten finden
 
Vielen Dank für die schnelle Antwort werde es gleich mal probieren.

Hast du ein Beispiel für Index of bin noch neu in xml

Vielen Dank

Blackbird001 21. Jun 2009 15:10

Re: Knoten finden
 
Leider funktioniert das auch nicht.

HAst du noch eine Idee bin schon am verzweifeln. :(

himitsu 21. Jun 2009 15:13

Re: Knoten finden
 
eigentlich sollte es gehn, da .Nodes einen Index oder NodeNamen entgegen nimmt
Zitat:

Delphi-Quellcode:
property Nodes[const IndexOrName: OleVariant]: IXMLNode;


Delphi-Quellcode:
i := Knotenliste.Nodes[1].ChildNodes.IndexOf('BankAccounts')

Blackbird001 21. Jun 2009 15:20

Re: Knoten finden
 
Also bekomme mit

KnotenListe.Nodes[1].ChildNodes.IndexOf('BankAccounts');

Bekomme ich immer -1 zurück auch wenn es den Knoten nicht gibt

himitsu 21. Jun 2009 15:44

Re: Knoten finden
 
wie ist denn die XML aufgebaut?

falls die erste 1 ( Knotenliste.Nodes[1] ) auch unterschiedlich ist, dann wird es nicht so einfach.

Blackbird001 21. Jun 2009 16:03

Re: Knoten finden
 
Also das mit BankAccounts konnte ich jetzt mit deiner Hilfe lösen, da das immer Knotenliste[1] sein muss.

Aber ich habe noch einen Knoten Artikle der innerhalb der Knotenliste auch an unterschiedlicher Stelle vorkommen kann. Wie kann ich rausfinden wo er ist.

Und den dann so ansprechen das ich die Attribute bekomme wo ich auch nicht weiß wo die dann genau stehen.

sx2008 21. Jun 2009 16:15

Re: Knoten finden
 
Da muss ich hier doch mal XPath in den Ring werfen.
Mit XPath ist das Lokalisieren der Knoten kein Problem - man braucht dann keine Schleifen für die Suche programmieren.
Beispiel:
Delphi-Quellcode:
nodelist := document.SelectNodes('//BankAccounts'); // findet all Elemente <BankAccounts>, egal auf welcher Ebene sie sind
for i := 0 to nodelist.length-1 do
begin
  elementnode := nodelist.Item[i] as IXMLDOMelement;
  ... := elementnode.GetAttribute('bankName');
end;
XPath ist wie eine neue Programmiersprache - mit dem Lernaufwand etwa mit SQL zu vergleichen.
Auf XPath zu verzichten wäre genau so wie auf SQL zu verzichten.

Blackbird001 21. Jun 2009 16:28

Re: Knoten finden
 
Und was ist wenn der Knoten nicht vorhanden ist? Und was bedeuten die beiden // bei BankAccounts?

himitsu 21. Jun 2009 16:30

Re: Knoten finden
 
Zitat:

Zitat von Blackbird001
Und was ist wenn der Knoten nicht vorhanden ist?

dann kann er nicht gefunden werden? :gruebel:

Zitat:

Zitat von Blackbird001
Und was bedeuten die beiden // bei BankAccounts?

http://de.wikipedia.org/wiki/XPath

Blackbird001 21. Jun 2009 16:34

Re: Knoten finden
 
Nein ich dachte es wird eine Exception ausgelöst.

Ist das in Delphie 7 alles schon von Grund auf vorhanden und benutzbar?

Ich hoffe die Frage klingt nicht zu dumm.

Werden auch die Elemente gefunden die auch unter dem Knoten aber auch unter dem Kindknoten befinden?

Blackbird001 21. Jun 2009 16:57

Re: Knoten finden
 
Ist in deinem Code NodeList ein IXMLNodeList

und was muss ich einbinden um es so nutzen zu können.

Bei funktioniert es so nicht.


// nodelist ist undefiniert kommt als Fehler
// elementnode ist undefiniert
nodelist := document.SelectNodes('//Article'); // findet all Elemente <BankAccounts>, egal auf welcher Ebene sie sind
for i := 0 to nodelist.length-1 do
begin
elementnode := nodelist.Item[i] as IXMLDOMelement;
text := elementnode.GetAttribute('id');
end;

Bitte um kurze Hilfe zu dem Beispielcode

himitsu 21. Jun 2009 17:07

Re: Knoten finden
 
Delphi-Quellcode:
Knotenliste.Nodes[1].ChildNodes
also wenn Nodes[1] nichts findet, dann kommt es auf die Einstellungen an
- ist eine Option als "nodes-auto-create" gesetzt ist, dann wird der Koten erstellt
- ist sowas nicht aktiv, dann gibt es eine exception, wenn versucht wird auf das Ergbnis (meißtens eine NIL-Referenz) zuzugreifen und davon etwas aufzurufen (hier .ChildNodes)

soweit ich das mit XPath versanden hab, dann kann man damit auch global suchen, also auch in Kindknoten.

Blackbird001 21. Jun 2009 17:11

Re: Knoten finden
 
Danke für deine tolle Hilfe. Nur kann ich dein Source Beispiel nicht nach vollziehen, vielleicht muss ich noch etwas einbinden um es nutzen zu können. Wäre toll wenn du es mir als Unit geben könntest damit ich sehe was ich einbinden muss um es so nutzen zu können. Hört sich nähmlich gut an und würde mir einige Zeilen an Code ersparen.
Brauch ich dazu irgendwelche Komponenten? Benutze Delphie 7 Enterprise

Und es soll kein Knoten erstellt werden, immer nur ausgelesen aus dem Dokument da ich den Text in den Attributen in eine DB übertragen will.

Blackbird001 22. Jun 2009 09:23

Re: Knoten finden
 
Hallo und guten morgen.

Ich kann dieses TDOM nicht nutzen da es in meinem Delphie nicht integriert ist gibt es zu meinem Problem noch eine andere Möglichkeit?

Vielen Dank

himitsu 22. Jun 2009 09:34

Re: Knoten finden
 
Welches Delphi hast denn?

Es sollte sich eigentlich überall einbinden lassen (nur in TDE ist das importieren wohl nicht so leicht möglich, aber da ist es vermutlich eh immer schon drin)

Oder such mal nach OmniXML.
(bei SimpleXML, ThaXML, JvSimpleXml, JclSimpleXml, muetze1's xmllib, meinem himXML und vielen anderen ist XPath so ja noch nicht enthalten)

Blackbird001 22. Jun 2009 09:51

Re: Knoten finden
 
Habe Delphie 7 Enterpriese


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