Ein Textknoten besteht nur aus Text. Unterelemente sind somit nicht erlaubt.
/ | 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.
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.
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 *.
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.
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.
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]
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.