![]() |
XML - nextSibling - übergeordnet ?
Hallo,
ich habe da ein XML Problem. Die XML Datei befindet sich im Anwendungsverzeichnis - als Kommentar hier im Quellcode. Den Aufbau der XML Datei kann ich nicht beeinflussen! Den einzigen Parameter den ich zum Auslesen zur Verfügung habe ist ZWEI. Zu diesem Eintrag gebe ich alle vorhandenen "eintragstext" aus. Frage: Wie es möglich vom gesuchten NODE aus die übergeordneten Werte: <eintrag TYP="222" EXTRA="987"> <element>654</element> <ebene ID="321"> auszugeben ? siehe edit 1 Frage: Ist Node.nextSibling.text die richtige Wahl oder kann man auch über die Attribute gehen ?
Delphi-Quellcode:
uses
MSXML2_TLB, ActiveX; procedure TForm1.Button1Click(Sender: TObject); var XMLDoc : IXMLDOMDocument2; NodeList : IXMLDOMNodeList; Node : IXMLDOMNode; i : Integer; Suche : String; begin CoInitialize(nil); Suche := 'ZWEI'; XMLDoc := CoDOMDocument40.Create; XMLDoc.load('test.xml'); Memo1.Lines.Append(XMLDoc.xml); { <?xml version="1.0" encoding="ISO-8859-1" ?> <Test> <titel>Überschrift</titel> <eintrag TYP="111" EXTRA="123"> <element>456</element> <ebene ID="789"> <stichwort>EINS</stichwort> <dreck>den</dreck> <eintragstext INHALT="TEXT1">Diesen Inhalt nicht 1</eintragstext> <eintragstext INHALT="TEXT2">Diesen Inhalt nicht 2</eintragstext> <eintragstext INHALT="TEXT3">Diesen Inhalt nicht 3</eintragstext> </ebene> </eintrag> <eintrag TYP="222" EXTRA="987"> <element>654</element> <ebene ID="321"> <stichwort>ZWEI</stichwort> <dreck>hier</dreck> <eintragstext INHALT="TEXT1">Inhalt Text 1</eintragstext> <eintragstext INHALT="TEXT2">Inhalt Text 2</eintragstext> <eintragstext INHALT="TEXT3">Inhalt Text 3</eintragstext> </ebene> </eintrag> <eintrag TYP="1212" EXTRA="9898"> <element>6565</element> <ebene ID="258"> <stichwort>DREI</stichwort> <dreck>nicht</dreck> <eintragstext INHALT="TEXT1">Diesen Inhalt nicht 1</eintragstext> <eintragstext INHALT="TEXT2">Diesen Inhalt nicht 2</eintragstext> <eintragstext INHALT="TEXT3">Diesen Inhalt nicht 3</eintragstext> </ebene> </eintrag> </Test> } NodeList := xmlDoc.documentElement.selectNodes('/Test/eintrag/ebene'); for i := 0 to NodeList.length -1 do begin Node := NodeList.item[i].selectSingleNode('stichwort'); if Node.Text = Suche then begin Memo1.Lines.Append('Stichwort: ' + Node.Text); Memo1.Lines.Append(''); Node := NodeList.item[i].selectSingleNode('eintragstext'); Memo1.Lines.Append(Node.text); Memo1.Lines.Append(Node.nextSibling.text); Memo1.Lines.Append(Node.nextSibling.nextSibling.text); Memo1.Lines.Append('-----------------------------------'); // edit 1 Node := NodeList.item[i].parentNode.selectSingleNode('@EXTRA'); Memo1.Lines.Append('EXTRA=' + Node.text); Node := NodeList.item[i].parentNode.selectSingleNode('element'); Memo1.Lines.Append('element=' + Node.text); Node := NodeList.item[i].parentNode.selectSingleNode('ebene/@ID'); Memo1.Lines.Append('ID=' + Node.text); // edit 1 break; end; end; if XMLDoc <> nil then XMLDoc := nil; CoUninitialize; end; Als Ausgabe erhalte ich: Zitat:
ich danke schonmal für euer bemühen user0815 |
Re: XML - nextSibling - übergeordnet ?
Hallo,
ich weiß jetzt nicht, ob ich deine Frage richtig verstanden habe und die Antwort kommt vielleicht ein wenig spät, aber warum lässt du dir nicht einfach über XPath den gesamten Knoten zurückgeben und interierst anschließend durch die Childnodes? In deinem Beispiel wäre das:
Delphi-Quellcode:
Liefert genau den/die Knoten, bei dem/denen das Stichwort = ZWEI ist.
xmlDoc.documentElement.selectNodes('/Test/eintrag[ebene/Stichwort="ZWEI"]')
So ersparst du dir das umständliche "Zurückgehangel" über den/die parent(s). Gruß |
Re: XML - nextSibling - übergeordnet ?
THX @Neuromancer,
ja das konnte ich noch gebrauchen. Funktioniert wunderbar ! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 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 by Thomas Breitkreuz