X-Path

Syntax

Element (-Knoten)
Umfasst den ganzen Bereich vom öffnenden bis zum schliessenden Tag: <film jahr="1959">Der unsichtbare Dritte</film>. Bei (X)HTML und anderen Dokumenten auch als Tag bezeichnet.
Attribut (-Knoten)
Detaildaten, die innerhalb des öffnenen Tag notiert sind: <film jahr="1959">Der unsichtbare Dritte</film>.
Text (-Knoten)

Ein Textknoten besteht nur aus Text. Unterelemente sind somit nicht erlaubt.

  • <film jahr="1959">Der unsichtbare Mann</film> enthält nur einen Textknoten.
  • <film jahr="1959">Der <i>unsichtbare</i> Dritte</film> enthält drei Textknoten, wobei der mittlere zum i-Tag gehört und die anderen beiden zum film-Tag.
Oft enthält der Textknoten zahlreiche (oder gar auschliesslich) sogenannte Whitespace Zeichen, damit das XML-Dokument auch ohne Software für Menschen gut lesbar ist.
Kommentar
Kommentare können an den selben Orten wie Textknoten erscheinen. Sie dienen einzig und allein der Erkärung gegenüner einem Mensch. Von den verarbeitenden Programmen werden sie meist ignoriert oder sogar heraus geschnitten. <!-- Kommentar, auch mehrzeilig -->
/ Trennzeichen innerhalb des Pfades
//Beliebige Pfadlänge
* Beliebiger Elementknoten
xyz Elementknoten des Typs xyz
. Aktueller Elementknoten
..Elternknoten
[ ]Begrenzer für weitere Suchkriterien
node()Repräsentiert Element- und Text-Knoten sowie Kommentare
text()Repräsentiert Text-Knoten
comment()Repräsentiert Kommentare
@xyz Markierung für Attribut-Knoten des Typs xyz
@node() @*Repräsentiert alle Attribut-Knoten
fkt()Funktionen für erweiterte Abfragen.

Tags werden in XPath-Ausdrücken über ihren Namen direkt oder via * allgemein angesprochen.

Attribute in XPath-Ausdrücken werden mit einem @ markiert, gefolgt vom Attributnamen. Ist die Attribute-Angabe das letzte Pfad-Element sind die Attributknoten selbst das Ergebnis. Ist die Angabe aber innerhalb eines [ ]-Blocks, ist der Elementknoten das Ziel.

//@plz und //*[@plz] ergeben die gleiche Anzahl von Trefferm, im ersten Fall die Attribute im zweiten die zugehörigen Knoten.

Text-Elemente werden mittels text() angesprochen. Die Funktion kann sowohl in [ ]-Blöcken wie auch direkt als letztes Element eines Pfades verwendet werden.

Kommentare werden mittels comment() angesprochen. Die Funktion kann sowohl in [ ]-Blöcken wie auch direkt als letztes Element eines Pfades verwendet werden.

Ein XML-Pfad und somit auch Suchausdrücke für XPath sind ähnlich einem Dateipfad aufgebaut. Die einzelnen Elemente (Knoten) innerhalb der Hierarchie (Pfad) sind mit / getrennt.

Ein doppelter // steht für eine beliebige Anzahl nicht genauer spezifizierter Elemente dazwischen (inklusive keinem). Firma//Person würde entsprechend auf Pfade wie Firma/Zuliefer/Person, Firma/Abteilung/Bereich/Person oder auch direkt Firma/Person passen.

Ein einzelner . verweist auf die aktuelle Position. Dies ist vor allem bei Suchabfragen nützlich.

Ein doppelter .. verweist auf den Elternknoten.

Elemente können auch über ihre Position innerhalb ihres Elternelement angesprochen werden, oft ist dies sogar zwingend notwendig.

Beispiele

Die Funktionen node(), text() und comment() sind überall erlaubt, alle anderen nur innerhalb von [ ]-Strukturen..

Details zu den einzelnen Funktionen.

Eine Suche liefert typischerweise kein einzelnes Resultat sondern eine Liste von Treffern. Diese Liste kann auch leer sein. Als Treffer kommen alle Knoten in Frage (Element, Attribut, Text oder Kommentar).

Ist der Suchausdruck fehlerhaft wird meist ein Fehler ausgeweorfen oder FALSE/NULL/none als Resultat zurück geliefert.

Eine Suche kann entweder ab dem aktuellen Element (Cursor) aus gestartet werden, oder von ganz oben her, also vom Wurzelelement.

Ein Suchtext der nicht mit / oder explizit mit einem einzelnen . beginnt, startet die Suche ab der aktuellen Cursor Position.

Wird ein Dokument neu geöffnet wird der Cursor standardmässig auf das Wurzelelement gesetzt. Je nach Anwendung wird der Cursor auch innerhalb eienr Schleife gesetzt, beispielsweise auf das nächste Element im gleichen Eltern-Knoten (Geschwister/Sibling) oder auf das Resultat einer vorangegangenen Suche.

Hinweis: Bei der Suche ab Cursor muss das Wurzelelement nicht notiert werden, da der Cursor sich (fast) immer irgendwo befindet, und dieses irgendwo ist das Wurzelelement selbst oder ein Element darunter.

Beispiele

Um die Suche vom Wurzelelement aus zu starten, muss der Suchtext mit einem einzelnen / oder doppeltem // beginnen. Die Position des Cursors ist hierbei ohne Bedeutung.

Hinweis: Beginnt der Suchtext mit dem einzelnen /, muss anschliessend immer das Wurzelelement notiert werden, entweder expizit (hier bezirk) oder als *.

Beispiele

Ein doppelter // steht für eine beliebige Abfolge von Knoten und Unterknoten, inklusive einer leeren Abfolge. Will man dmait ab dem aktuellen Cursor suchen, muss .// verwendet werden. // kann auch innerhalb des SUchterms verwendet werden.

Beispiele

Die bisherigen Mechansimen erlauben nur grobe Suchabfragen. Für feinere Abfragen werden [ ]-Strukturen und Funktionen verwendet. Typische Tests sind Bereichsabfragen bei Zahlen oder Suchmuster bei Texten. Abgefragt werden Attributwerte oder Textelemente.

Textangaben müssen immer mit Anführungszeichen eingefasst werden (doppelte oder einfache). Bei Zahlenangaben ist die nicht nötig. Als Dezimaltrennzeichen wird der Punkt verwendet. Leerzeichen ausserhalb von Texten werden ignoriert.

Das Ergebins einer Suche mittels [ ] sind die zugehörigen Element-Knoten und nicht etwa die Attribute. Will man aber diese erhalten, muss man sie nochmals explizit anführen: //*[@flaeche > 5] versus //*[@flaeche > 5]/@flaeche

Das kann man aber nutzen um mittels dem einem Attribut zu suchen, ein anderes aber zu erhalten: //*[@plz = '8152']/@name

Die verschiedenen Funktionen werden unter Funktionen erläutert. Je nach Programmiersprache und Version sind nicht alle und/oder auch weitere verfügbar.

Gleichheit und Ungleichheit (Text und Zahlen) = !=
//*[@name='Wil'] //*[@plz != 8152]
Numerische Vergleiche (Zahlen) = < > <= >= !=
//*[@flaeche >= 9.9]
Logische Operatoren and or

Verknüpft zwei Bedingungen. Kann auch weiter verschachtelt werden inklusive Klammerungen. Anstelle von and können auch zwei [ ]-Blöcke verwendet werden.

and-Verknüpfungen binden stärker als or-Verknüpfungen. Im zweiten der folgenden Beispiele sind daher die Klammern optional.

//*[@plz=8152 or @plz=8304 or @plz=9999]
//*[@plz=8181 or (@plz>8300 and @flaeche>8)]
//*[@name='Wil'][@plz=8196]

Verknüpfung zweier Ergebnisse |

Kombination zweier (unabhängiger) Ergebnisse. Ergebnis ohne Duplikate in natürlicher Reihenfolge. //*[@plz=8152] | //see

Es können auch verschiedene Typen gemischt werden, was aber selten sinnvoll ist: //*[@plz=8152]/@plz | //see

Sogenannte Jokerzeichen, wie man sie von Suchfunktionen in Dateisystemen (Beispiel: Brief*.doc) kennt, sind nicht erlaubt. Dafür stehen aber entsprechende Funktionen zur Verfügung. Ebenso können (leider) keine reguläre Ausdrücke verwendet werden.