Xpath

Abfragesprache zum Adressieren von XML-Elementen
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 11. März 2005 um 16:56 Uhr durch 790 (Diskussion | Beiträge). Sie kann sich erheblich von der aktuellen Version unterscheiden.

XPath (oder auch XML Path Language) ist eine Abfrage-Sprache, um Teile eines XML-Dokumentes zu adressieren. XPath wird vom W3C-Konsortium entwickelt.

XPath ist die Grundlage für XPointer, das weitergehende Adressierungsmöglichkeiten bietet, und beide sind die Grundlage für XLink, das die Einbindung von Verweisen in XML-Dokumente standardisiert.

XPath 1.0 bildet ausserdem die Grundlage der in XSLT verwendeten Muster. Die nächste Version, XPath 2.0, wird zudem die Grundlage der XML-Abfragesprache XQuery bilden.

Prinzipien von XPath 1.0

Ein XPath-Ausdruck adressiert Teile eines XML-Dokuments, das dabei als Baum betrachtet wird, wobei einige Unterschiede zum "klassischen" Baum der Graphentheorie zu beachten sind:

  • Knoten (nodes) des Baumes sind sind XML-Elemente, -Attribute, -Kommentare, -Namensräume und -Verarbeitungsanweisungen.
  • Nur XML-Elemente gelten als child im Sinne einer XPath-Achse. Alle anderen Knoten stehen auf der gleichen Hierarchie-Stufe des Baumes wie der Knoten der sie enthält.
  • Die Achsen preceding, following, preceding-sibling und following-sibling orientieren sich nicht allein an der Baumstruktur sondern auch an der Reihenfolge der Deklaration der Elemente im XML-Dokument.

Eine XPath-Ausdruck setzt sich zusammen aus einem oder mehrerenLocation Steps, die mit dem Zeichen / getrennt werden. Ein Location-Step besteht aus Achse und Knotentest, optional gefolgt von einem oder mehreren Prädikaten.

Beliebig viele XPath-Ausdrücke lassen sich mit dem Zeichen | vereinigen.

Es gibt stets verschiedene Möglichkeiten, eine gesuchte Knotenmenge in XPath auszudrücken.

Achsen

Durch Angabe von Achsen wird ausgehend vom aktuellen Kontextknoten in der Baumstruktur des XML-Dokuments navigiert.

Wird dabei von der Wurzel des XML-Dokuments ausgegangen, wird dem XPath-Ausdruck das Zeichen / vorangestellt.

Achse adressierte Knoten Abkürzung
child direkt untergeordnete weglassen
parent direkt übergeordnete ..
self der Referenzknoten selbst (nützlich für zusätzliche Bedingungen) .
ancestor übergeordnete
ancestor-or-self übergeordnete, oder der Knoten selbst
descendant untergeordnete
descendant-or-self untergeordnete, oder der Knoten selbst //
following gleiche Ebene der Baumstruktur, nachfolgend im XML-Dokument
following-sibling wie following, und vom gleichen parent stammend
preceding gleiche Ebene der Baumstruktur, vorhergehend im XML-Dokument
preceding-sibling wie preceding, und vom gleichen parent stammend
attribute @
namespace

Knotentests

Knotentests (geschrieben Achse::Knotentest) schränken die Elementauswahl einer Achse ein:

  • Angabe eines Elementnamens wählt alle entsprechenden Elemente.
    Beispiel: //children::Foo wählt alle Elemente im Dokument die den Namen "Foo" haben.
  • Mit dem Zeichen * wählt man beliebige Elemente.
    Beispiel: //children::Foo/children::* wählt alle Elemente im Dokument die Kinder von Elementen mit dem Namen "Foo" sind.
  • Mit text(), comment() und processing-instruction() lassen sich Knoten bestimmten Typs wählen.
    Zu beachten ist das Attribute und Namensräume nicht in Knotentests, sondern als eigene Achse gewählt werden.

Prädikate

Durch Angabe von Prädikaten, die in eckige Klammern eingeschlossen werden, kann das Ergebnis weiter eingeschränkt werden. Es können beliebig viele Prädikate hintereinander geschrieben werden. Prädikate können XPath-Ausdrücke sein, ausserdem kann eine Vielzahl von Funktionen verwendet werden, von denen hier nur die wichtigsten aufgeführt sind:

  • Wahrheitsfunktionen: = != and or < > <= >=
  • Zeichenkettenfunktionen:
    • normalize-space() - Entfernen von Leerzeichen am Anfang und Ende des Strings
    • substring() - Einen Teilstring selektieren
    • string-length() - Länge des Strings
  • Numerische Funktionen: + - * / mod
  • Knotenmengen-Funktionen:
    • count() - Anzahl der Nodes in einem Nodeset
    • id() - Selektiert Elemente über die DTD-ID
    • name() - Name des Knotens

Beispiel: //children::Buch[count(./Seite)<=100][count(./Seite)>=10] liefert alle Knoten vom Typ "Buch", die mindestens 10 aber höchtens 100 Kindelemente vom Typ "Seite" haben.

Beispiel

Gegeben sei folgendes XML-Dokument:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<dok>
    <!-- ein XML-Dokument -->
    <kap title="Nettes Dokument">
        <pa>Ein Absatz</pa>
        <pa>Noch ein Absatz</pa>
        <pa>Und noch Absatz</pa>
        <pa>Nett, oder?</pa>
    </kap>
    <kap title="Zweites Kapitel">
        <pa>Ein Absatz</pa>
    </kap>
</dok>
Datei:Xpathtester.png
XPathTester, angewendet auf den letzten Beispiel-Ausdruck

Beispiele für XPath-Ausdrücke:

  • /dok selektiert das Wurzel dok-Element
  • /* selektiert jedes Wurzel-Element
  • /dok/kap selektiert alle kap-Elemente innerhalb eines dok Elements
  • /dok/kap[1] selektiert das erste kap-Elemente innerhalb eines dok Elements
  • //pa selektiert alle pa-Elemente auf allen Ebenen (Vorsicht: langsam)
  • //kap[@title="Nettes Dokument"]/pa selektiert alle Absätze des Kapitels "Nettes Dokument".

XPath-Visualisierer helfen, die mitunter komplizierten XPath-Abfragen auf konkrete XML-Dateien anzuwenden. Im nebenstehenden Bild wird dies beispielsweise an der JAVA-Anwendung XPathTester gezeigt.

Siehe auch