XML und die Verwendung von XPath
XML und die Verwendung von XPath
Bei der Bearbeitung meiner XML-Dokumente möchte ich XPath einsetzen.
Ich habe zwar im Netz den Hinweis auf die Unit XPath gefunden jedoch keine Beispielsourcen zur Anwendung dieser.
Hat jemand hierzu einen Hinweis, Link oder evtl. sogar Beispielcode?
Ich habe zwar im Netz den Hinweis auf die Unit XPath gefunden jedoch keine Beispielsourcen zur Anwendung dieser.
Hat jemand hierzu einen Hinweis, Link oder evtl. sogar Beispielcode?
Re: XML und die Verwendung von XPath
Hatte auch keine Ahnung aber ich habe mal kurz etwas rumprobiert. Müsste klappen.
Beispiel XML etc. gibt es hier:
http://www.w3schools.com/xpath/xpath_syntax.asp
Code: Alles auswählen
uses dom, XMLRead, XPath;
...
procedure TForm1.Button1Click(Sender: TObject);
var
XML: TXMLDocument;
xpathValue: TXPathVariable;
strStream: TStringStream;
begin
strStream := TStringStream.Create(mmoXML.Text);
ReadXMLFile(XML, strStream);
strStream.Free;
xpathValue := EvaluateXPathExpression(UTF8Decode(EdtXPath.Text), XML);
EdtXPathResult.Text := UTF8Encode(xpathValue.AsText);
XML.Free;
xpathValue.free;
end;
http://www.w3schools.com/xpath/xpath_syntax.asp
Re: XML und die Verwendung von XPath
Hallo Theo,
vielen Dank für die schnelle Antwort. Ich habe Dein Beispiel ausprobiert und genau das gewünschte Ergebnis erhalten.
Das war genau der Anstoß, den ich gesucht habe.
vielen Dank für die schnelle Antwort. Ich habe Dein Beispiel ausprobiert und genau das gewünschte Ergebnis erhalten.
Das war genau der Anstoß, den ich gesucht habe.

Re: XML und die Verwendung von XPath
Jetzt habe ich doch noch eine weitere Frage.
Ich suche jetzt noch die Möglichkeit auf Informationen rund um das Ergebnis einer XPath-Abfrage zuzugreifen.
Beispiel:
XML-File:
<?xml version="1.0"?>
<info id="0">
<session id="1">sessionname1</session>
<session id="2">sessionname2</session>
<session id="3">sessionname3</session>
</info>
XPath-String: //*[@id="1"]
Ergebnis=sessionname1
Ich würde jetzt noch den Namen des Knoten "session" und dessen Pfad "/info/session[1]" ermitteln wollen.
Ich suche jetzt noch die Möglichkeit auf Informationen rund um das Ergebnis einer XPath-Abfrage zuzugreifen.
Beispiel:
XML-File:
<?xml version="1.0"?>
<info id="0">
<session id="1">sessionname1</session>
<session id="2">sessionname2</session>
<session id="3">sessionname3</session>
</info>
XPath-String: //*[@id="1"]
Ergebnis=sessionname1
Ich würde jetzt noch den Namen des Knoten "session" und dessen Pfad "/info/session[1]" ermitteln wollen.
Re: XML und die Verwendung von XPath
Da ich mich noch nie damit beschäftigt habe und es ganz lustig finde, hier noch ein Beispiel wie man mehrere Resultatknoten ausliest.
Pro memoria:
Dann geht auch sowas
Vom Beispiel hier: http://www.w3schools.com/xpath/xpath_syntax.asp
Pro memoria:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
XML: TXMLDocument;
xpathValue: TXPathVariable;
strStream: TStringStream;
ns:TNodeSet;
i:integer;
begin
strStream := TStringStream.Create(mmoXML.Text);
ReadXMLFile(XML, strStream);
strStream.Free;
xpathValue := EvaluateXPathExpression(UTF8Decode(EdtXPath.Text), XML);
ns:=xpathValue.AsNodeSet;
mmoXPathResult.Clear;
for i:=0 to ns.Count-1 do
if TDOMNode(ns[i]).HasChildNodes then
mmoXPathResult.Lines.Add(UTF8Encode(TDOMNode(ns[i]).NodeName)+':'+UTF8Encode(TDOMNode(ns[i]).FirstChild.NodeValue));
XML.Free;
xpathValue.free;
end;
Code: Alles auswählen
//book/title | //book/price
Re: XML und die Verwendung von XPath
Da war ich fast gleichzeitig.aXied hat geschrieben: Ich suche jetzt noch die Möglichkeit auf Informationen rund um das Ergebnis einer XPath-Abfrage zuzugreifen.
Beantwortet das oben deine Frage mit?
Über das casting TDOMNode(ns) kommt man auf den Node und kann von dort aus alle Infos auslesen (ParentNode, FirstChild, Attributes etc.)
Re: XML und die Verwendung von XPath
Liest sich ganz gut.
Werds heute Abend ausprobieren und mich wieder bei Dir melden. Danke schon mal für die prompte Antwort.

Werds heute Abend ausprobieren und mich wieder bei Dir melden. Danke schon mal für die prompte Antwort.

Re: XML und die Verwendung von XPath
Ok, funktioniert alles bestens, genau so wie Du beschrieben hast.
Was ich allerdings immer noch vermisse ist eine Möglichkeit auf den NodePath komfortabel zuzugreifen.
Ich hatte vorher mit der libxml2 gearbeitet, bei der es die Funktion xmlGetNodePath gibt.
Ich habe leider eine solche Funktion nicht gefunden.

Was ich allerdings immer noch vermisse ist eine Möglichkeit auf den NodePath komfortabel zuzugreifen.
Ich hatte vorher mit der libxml2 gearbeitet, bei der es die Funktion xmlGetNodePath gibt.
Ich habe leider eine solche Funktion nicht gefunden.
Re: XML und die Verwendung von XPath
Weiss nicht, dann schreibt du halt eine. Es kann ja nicht so schwierig sein, sich am ParentNode hochzuhangeln.aXied hat geschrieben: Ich habe leider eine solche Funktion nicht gefunden.
Das geht sicher schneller als das Verfassen von zig Foreneinträgen.

Re: XML und die Verwendung von XPath
Nun ja, das schreiben einer solchen Funktion ist in anbetracht komplexer Pfade(/info/session[2]/@id) bei XPath(//*[@id="2"]/@id) evtl. garnicht so einfach.
Ausserdem denke ich, dass dies eine Grundlegende Funktion ist welche ich bisher nur nicht gefunden habe.
Ich werde einfach mal weiterforschen.
Aber trotzdem vielen Dank für Deine Unterstützung.
Ausserdem denke ich, dass dies eine Grundlegende Funktion ist welche ich bisher nur nicht gefunden habe.
Ich werde einfach mal weiterforschen.
Aber trotzdem vielen Dank für Deine Unterstützung.
Re: XML und die Verwendung von XPath
Versteh ich nicht. Pfad ist Pfad. (z.B. /bookstore/book/title)aXied hat geschrieben:Nun ja, das schreiben einer solchen Funktion ist in anbetracht komplexer Pfade(/info/session[2]/@id) bei XPath(//*[@id="2"]/@id) evtl. garnicht so einfach.
Was hat das mit der XPath Syntax zu tun?
Re: XML und die Verwendung von XPath
Den Pfad den Du als Beispiel nennst, beschreibt ja "nur" eine flache Hirarchie (<bookstore><book><title/></book></bookstore>).
In meinem Beispiel suche ich nach dem Eintrag mit dem Attribut "id" welches den Wert "2" enthält.
Gefunden wird dann eben der 2. von drei gleichnamigen Knoten "/info/session[2]/@id".
Ich wüsste im Moment jetzt nicht wie ich an die Position des Knoten "session[?]" komme.
In meinem Beispiel suche ich nach dem Eintrag mit dem Attribut "id" welches den Wert "2" enthält.
Gefunden wird dann eben der 2. von drei gleichnamigen Knoten "/info/session[2]/@id".
Ich wüsste im Moment jetzt nicht wie ich an die Position des Knoten "session[?]" komme.
Re: XML und die Verwendung von XPath
Ich weiss eigentlich gar nicht, was du überhaupt erreichen willst. Wieder einmal ein Fall für "smart-questions:Beschreibe das Ziel, nicht einen Schritt "
http://www.tty1.net/smart-questions_de.html#goal
http://www.tty1.net/smart-questions_de.html#goal
Re: XML und die Verwendung von XPath
Der so "//*[@id="2"]/@id" gefundene Wert "2" soll zum Beispiel auch in einem Log-/Debugfile ausgegeben werden.
Um es dem Leser einfacher zu machen sollte dann eben nicht nur ID="2" oder gar der XPath-String, sondern eben /info/session[2]/@id="2" zu lesen sein.
Da ich eine bisher verwendete LIB portieren möchte, müssen eben auch die bisherigen Funktionen erhalten bleiben.
Um es dem Leser einfacher zu machen sollte dann eben nicht nur ID="2" oder gar der XPath-String, sondern eben /info/session[2]/@id="2" zu lesen sein.
Da ich eine bisher verwendete LIB portieren möchte, müssen eben auch die bisherigen Funktionen erhalten bleiben.
Re: XML und die Verwendung von XPath
Wie gesagt, dann musst du diese Funktionen halt schreiben. Das kann nicht so schwierig sein.aXied hat geschrieben: Da ich eine bisher verwendete LIB portieren möchte, müssen eben auch die bisherigen Funktionen erhalten bleiben.
Der schwierige Teil der Geschichte ist ja gemacht, in Xpath, Dom, XMLRead