![]() |
Knoten finden
Hallo vielleicht könnt ihr mir bei einem Problem helfen.
Hier erst einmal der Code
Delphi-Quellcode:
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.
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; Könnt ihr mir vielleicht ein kleines Beispiel geben. Vielen Dank. |
Re: Knoten finden
versuch mal
Delphi-Quellcode:
außerdem müßte ChildNodes soetwas wie IndexOf kennen
Knotenliste.Nodes[1].ChildNodes.Nodes['BankAccounts']
|
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 |
Re: Knoten finden
Leider funktioniert das auch nicht.
HAst du noch eine Idee bin schon am verzweifeln. :( |
Re: Knoten finden
eigentlich sollte es gehn, da .Nodes einen Index oder NodeNamen entgegen nimmt
Zitat:
Delphi-Quellcode:
i := Knotenliste.Nodes[1].ChildNodes.IndexOf('BankAccounts')
|
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 |
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. |
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. |
Re: Knoten finden
Da muss ich hier doch mal
![]() Mit XPath ist das Lokalisieren der Knoten kein Problem - man braucht dann keine Schleifen für die Suche programmieren. Beispiel:
Delphi-Quellcode:
XPath ist wie eine neue Programmiersprache - mit dem Lernaufwand etwa mit SQL zu vergleichen.
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; Auf XPath zu verzichten wäre genau so wie auf SQL zu verzichten. |
Re: Knoten finden
Und was ist wenn der Knoten nicht vorhanden ist? Und was bedeuten die beiden // bei BankAccounts?
|
Re: Knoten finden
Zitat:
Zitat:
![]() |
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? |
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 |
Re: Knoten finden
Delphi-Quellcode:
also wenn Nodes[1] nichts findet, dann kommt es auf die Einstellungen an
Knotenliste.Nodes[1].ChildNodes
- 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. |
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. |
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 |
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) |
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