XPath

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Die XML Path Language (XPath) ist eine vom W3-Konsortium entwickelte Abfragesprache, um Teile eines XML-Dokumentes zu adressieren und auszuwerten. XPath dient als Grundlage einer Reihe weiterer Standards wie XSLT, XPointer und XQuery. Seit ihrer Verabschiedung am 23. Januar 2007 hat XPath 2.0 die seit 1999 gültige Version XPath 1.0 abgelöst. XPath 2.0 hat einige Konzepte von XPath 1.0 neu definiert und verfügt zudem über einen wesentlich erweiterten Funktionsumfang, wie beispielsweise die Unterstützung regulärer Ausdrücke für Zeichenketten.

Prinzipien[Bearbeiten]

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 der Dokumenten-Knoten, XML-Elemente, -Attribute, -Textknoten, -Kommentare, -Namensräume und -Verarbeitungsanweisungen.
  • 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 (Linked-Tree).


Ein XPath-Ausdruck setzt sich aus einem oder mehreren Lokalisierungsschritten (Location Steps) zusammen. Sie werden mit dem Zeichen "/" getrennt.

Ein Lokalisierungsschritt axis::node-test[predicate 1][predicate 2]... besteht aus:


Beliebig viele XPath-Ausdrücke lassen sich mit dem Pipe-Zeichen   |   mengenmäßig vereinigen.

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

XPath operiert auf der logischen Dokumentenstruktur. Das bedeutet zum Beispiel, dass man Entitäten schon geparst vorfindet oder dass auch eventuelle Standard-Attribute und -Knoten, die durch ein Schema vorgegeben werden, schon im Baum enthalten sind.

Achsen[Bearbeiten]

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

Wird dabei vom Dokument-Knoten (der Wurzel des XML-Dokuments) ausgegangen, wird dem XPath-Ausdruck das Zeichen / vorangestellt.

Achse adressierte Knoten Abkürzung Position im u.a. Baum
(ausgehend von Element D)
Dokument-Knoten / Dokument-Knoten
child direkt untergeordnete Knoten wird weggelassen E, G
parent der direkt übergeordnete Elternknoten ./.. B
self der Kontextknoten selbst (nützlich für zusätzliche Bedingungen) . D
ancestor übergeordnete Knoten B, A
ancestor-or-self übergeordnete Knoten inklusive des Kontextknotens D, B, A
descendant untergeordnete Knoten .// E, F, G
descendant-or-self untergeordnete Knoten inklusive des Kontextknotens D, E, F, G
following im XML-Dokument nachfolgend (ohne untergeordnete Knoten) H, I, J, K, L
following-sibling wie following, aber zugleich vom selben parent stammend H, I
preceding im XML-Dokument vorangehend (ohne übergeordnete Knoten) C
preceding-sibling wie preceding, aber zugleich vom selben parent stammend C
attribute Attributknoten @
namespace Namensraumknoten, die aus dem Attribut xmlns stammen

Dieser Baum visualisiert beispielhaft die Struktur eines XML Dokuments

  Dokument-Knoten
        |
        A         
       _|_        
      |   |       
      B   L       
    __|________   
   |   |   |   |  
   C  (D)  H   I  
      _|_     _|_ 
     |   |   |   |
     E   G   J   K
     |            
     F            

Die fünf Achsen self, ancestor, descendant, preceding und following bilden ausgehend von einem beliebigen Knoten den Dokumentbaum vollständig und überlappungsfrei ab.[1]

Knotentests[Bearbeiten]

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

  • Angabe eines Elementnamens wählt alle entsprechenden Elemente.
    Beispiel: /descendant-or-self::Foo wählt alle Elemente im Dokument, die den Namen „Foo“ haben.
  • Mit dem Zeichen * wählt man beliebige Elemente.
    Beispiel: /descendant-or-self::Foo/child::* 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.

Prädikate[Bearbeiten]

Dieser Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf mit, ihn zu verbessern, und entferne anschließend diese Markierung.

Durch Angabe von Prädikaten kann das Ergebnis weiter eingeschränkt werden. Prädikate werden in eckige Klammern eingeschlossen und können in beliebiger Zahl hintereinander geschrieben werden, wobei die Reihenfolge wesentlich ist. Prädikate können XPath-Ausdrücke enthalten, außerdem kann eine Vielzahl von Funktionen und Operatoren verwendet werden. Die sind zum Beispiel:

  • Zugriffsindex (Zählung beginnt bei 1)
  • Relationszeichen: = != and or < > <= >=
  • Zeichenkettenfunktionen:
    • normalize-space() – Entfernen von Leerzeichen am Anfang und Ende des Strings und Reduktion aufeinanderfolgender Leerzeichen auf eines
    • substring() – Einen Teilstring selektieren
    • substring-before(source, splitter) – Einen Teilstring vor dem ersten Vorkommen des Trennzeichens selektieren
    • substring-after(source, splitter) – Einen Teilstring nach dem ersten Vorkommen des Trennzeichens selektieren
    • string-length() – Länge des Strings
  • Numerische Operatoren: + - * div mod
  • Knotenmengen-Funktionen:
    • count() – Anzahl der Knoten in einer Knotenmenge
    • id() – Selektiert Elemente über die DTD-ID
    • name() – Name des Knotens

Beispiele:

  • //child::Buch/Kapitel Alle Kapitel aller Bücher.
  • //child::Buch/Kapitel[1] Alle ersten Kapitel aller Bücher.
  • //child::Buch[count(./Seite)<=100][count(./Seite)>=10] liefert alle Knoten vom Typ „Buch“, die mindestens 10 aber höchstens 100 Kindelemente vom Typ „Seite“ haben.

(das gleiche leistet //Buch[count(Seite)<=100 and count(Seite)>=10])

  • substring-before($variable, ':') Selektiert den Teilstring vor dem ersten Doppelpunkt aus dem Wert der Variable mit dem Namen variable

Beispiel[Bearbeiten]

Gegeben sei folgendes XML-Dokument:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<dok>
    <!-- ein XML-Dokument -->
    <kap title="Nettes Kapitel">
        <pa>Ein Absatz</pa>
        <pa>Noch ein Absatz</pa>
        <pa>Und noch ein Absatz</pa>
        <pa>Nett, oder?</pa>
    </kap>
    <kap title="Zweites Kapitel">
        <pa>Ein Absatz</pa>
        <pa format="bold">Erste Zeile</pa>
        <pa format="bold">Zweite Zeile</pa>
        <pa format="italic">Dritte Zeile</pa>
    </kap>
</dok>

Beispiele für XPath-Ausdrücke:

Ausdruck selektiert ...
/dok das erste Element dok
/* das äußerste Element unabhängig vom Namen (jedes wohlgeformte XML-Dokument hat genau ein äußerstes Element), hier dok
//dok/kap alle kap-Elemente innerhalb aller dok-Elemente
//dok/kap[1] alle ersten kap-Elemente innerhalb aller dok-Elemente
//pa alle pa-Elemente auf allen Ebenen
//kap[@title='Nettes Kapitel']/pa alle Absätze der Kapitel mit Titel „Nettes Kapitel“.
//kap/pa[2] Jeweils das zweite pa-Element in den beiden Kapiteln.
//kap[2]/pa[2][@format='bold'] Zweite Zeile mit dem Format 'bold' im 2. Kapitel.
child::* alle Kindelemente des gegenwärtigen Knotens
child::pa alle pa-Kinder des gegenwärtigen Knotens
child::text() alle Textknoten des gegenwärtigen Knotens
. der gegenwärtige Knoten
./* alle Kindelemente des gegenwärtigen Knotens
./pa alle pa-Kinder des gegenwärtigen Knotens
pa alle pa-Kinder des gegenwärtigen Knotens
attribute::* alle Attribute des gegenwärtigen Knotens
namespace::* alle Namespaces des gegenwärtigen Knotens
/kap[1]/pa[2]/text() Textinhalt des zweiten pa-Elements im ersten kap-Element (also "Noch ein Absatz")

XPath-Visualisierer helfen, die mitunter komplizierten XPath-Abfragen auf konkrete XML-Dateien anzuwenden.

Siehe auch[Bearbeiten]

Einzelnachweise[Bearbeiten]

  1. http://www.w3.org/TR/xpath#axes

Literatur[Bearbeiten]

  • Michael Kay: XPath 2.0 Programmer's Reference Wrox Press, 2004, ISBN 0-7645-6910-4 (englisch)
  •  Margit Becher: XML - DTD, XML-Schema, XPath, XQuery, XSLT, XSL-FO, SAX, DOM. W3L Verlag, Witten 2009, ISBN 978-3-937137-69-8.

Weblinks[Bearbeiten]