XML und die Verwendung von XPath

Rund um die LCL und andere Komponenten
aXied
Beiträge: 20
Registriert: Mo 30. Sep 2013, 20:57

XML und die Verwendung von XPath

Beitrag von aXied »

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?

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: XML und die Verwendung von XPath

Beitrag von theo »

Hatte auch keine Ahnung aber ich habe mal kurz etwas rumprobiert. Müsste klappen.

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;   
 
Beispiel XML etc. gibt es hier:
http://www.w3schools.com/xpath/xpath_syntax.asp

aXied
Beiträge: 20
Registriert: Mo 30. Sep 2013, 20:57

Re: XML und die Verwendung von XPath

Beitrag von aXied »

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. :wink:

aXied
Beiträge: 20
Registriert: Mo 30. Sep 2013, 20:57

Re: XML und die Verwendung von XPath

Beitrag von aXied »

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.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: XML und die Verwendung von XPath

Beitrag von theo »

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:

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;        
Dann geht auch sowas

Code: Alles auswählen

//book/title | //book/price
Vom Beispiel hier: http://www.w3schools.com/xpath/xpath_syntax.asp

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: XML und die Verwendung von XPath

Beitrag von theo »

aXied hat geschrieben: Ich suche jetzt noch die Möglichkeit auf Informationen rund um das Ergebnis einer XPath-Abfrage zuzugreifen.
Da war ich fast gleichzeitig.
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.)

aXied
Beiträge: 20
Registriert: Mo 30. Sep 2013, 20:57

Re: XML und die Verwendung von XPath

Beitrag von aXied »

Liest sich ganz gut. :wink:
Werds heute Abend ausprobieren und mich wieder bei Dir melden. Danke schon mal für die prompte Antwort. :D

aXied
Beiträge: 20
Registriert: Mo 30. Sep 2013, 20:57

Re: XML und die Verwendung von XPath

Beitrag von aXied »

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.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: XML und die Verwendung von XPath

Beitrag von theo »

aXied hat geschrieben: Ich habe leider eine solche Funktion nicht gefunden.
Weiss nicht, dann schreibt du halt eine. Es kann ja nicht so schwierig sein, sich am ParentNode hochzuhangeln.
Das geht sicher schneller als das Verfassen von zig Foreneinträgen. ;-)

aXied
Beiträge: 20
Registriert: Mo 30. Sep 2013, 20:57

Re: XML und die Verwendung von XPath

Beitrag von aXied »

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.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: XML und die Verwendung von XPath

Beitrag von theo »

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.
Versteh ich nicht. Pfad ist Pfad. (z.B. /bookstore/book/title)
Was hat das mit der XPath Syntax zu tun?

aXied
Beiträge: 20
Registriert: Mo 30. Sep 2013, 20:57

Re: XML und die Verwendung von XPath

Beitrag von aXied »

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.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: XML und die Verwendung von XPath

Beitrag von theo »

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

aXied
Beiträge: 20
Registriert: Mo 30. Sep 2013, 20:57

Re: XML und die Verwendung von XPath

Beitrag von aXied »

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.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: XML und die Verwendung von XPath

Beitrag von theo »

aXied hat geschrieben: Da ich eine bisher verwendete LIB portieren möchte, müssen eben auch die bisherigen Funktionen erhalten bleiben.
Wie gesagt, dann musst du diese Funktionen halt schreiben. Das kann nicht so schwierig sein.
Der schwierige Teil der Geschichte ist ja gemacht, in Xpath, Dom, XMLRead

Antworten