XPath
Aus 4webmaster.de
|
Die XML Path Language ist eine vom W3C entwickelte Anfragesprache, um Teile eines XML-Dokumentes zu adressieren. Beispielsweise adressiert html/table/tr/td die erste Zelle einer Tabelle, die am Anfang einer HTML-Seite steht. XPath zu verstehen lohnt sich, da diese Sprache alle Begriffe und Strukturen von XML unter ein Konzept fasst.
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.
Jedes Element, jedes Attribut, jeder PCDATA- oder CDATA-Inhalt und fast jedes andere XML-Objekt ist ein Knoten (node) in der Baumstruktur, die das XML-Dokument bildet. XPath-Ausdrücke orientieren sich in dieser Struktur, d.h. man adressiert Teile des XML-Dokumentes, indem man den Pfad zu ihnen angibt. Das Ergebnis eines XPath-Ausdrucks ist entweder ein einzelner Knoten oder eine Menge von Knoten (node-set). Die Ergebnisknoten können zusammenhängen oder nicht zusammenhängen. XPath verwendet selbst nicht den XML-Syntax, sondern eigene Funktionen und Ausdrücke.
Beispiel
Wir betrachten folgendes Beispiel-Dokument:
<?xml version="1.1" ?> <dok> <!-- ein XML-Dokument --> <kap title="Nettes Dokument"> <pa>Ein Absatz</pa> <pa>Bla Bla</pa> </kap> <kap title="Zweites Kapitel"> <pa>Blubb Blubb</pa> </kap> </dok>
Als Baumstruktur visualisiert ergibt sich die unten dargestellte Struktur. Oben wird immer der Name des Knotens angegeben, unten der Inhalt. Der Name für den Root-Node, für Kommentarknoten und für Textknoten (PCDATA) ist leer. Element-Knoten sind blau, alle anderen Knotentypen grau dargestellt. Nur Element-Knoten können Childs haben.

Beispiele für XPath-Ausdrücke:
-
/dokselektiert das Document-Elementdok -
/∗selektiert das Document-Element unabhängig vom Namen (jedes wohlgeformte XML-Dokument hat genau ein Document-Element) -
/dok/kapselektiert allekap-Elemente innerhalb einesdokElements -
/dok/kap[1]selektiert das erstekap-Elemente innerhalb einesdokElements -
//paselektiert allepa-Elemente auf allen Ebenen (Vorsicht: langsam) -
//kap[@title="Nettes Dokument"]/paselektiert alle Absätze des Kapitels „Nettes Dokument“. -
child::∗selektiert Alle Kindelemente des gegenwärtigen Knotens -
child::paAlle pa-Kinderelemente des gegenwärtigen Knotens -
child::text()Alle Textknoten des gegenwärtigen Knotens -
attribute::∗Alle Attribute des gegenwärtigen Knotens
Knoten
Der Begriff des Knoten orientiert sich nur grob am gleichlautenden Begriff der Graphentheorie.
- Knoten des Baumes sind XML-Elemente, -Attribute, -Textknoten, -Kommentare, -Namensräume und -Verarbeitungsanweisungen.
- Nur XML-Elemente haben Childs (untergeordnete Knoten). Alle anderen Knoten stehen auf der gleichen Hierarchiestufe des Baumes wie der Knoten, der sie enthält.
- Nicht nur die hierarchische Struktur, sondern auch die Reihenfolge der Deklaration im XML-Dokument kann zur Adressierung verwendet werden.
Die folgenden Knotentypen werden unterschieden:
| Knotentyp | Erklärung | Name | String-Value |
|---|---|---|---|
| Elementknoten | Alle normalen Element des XML-Dokumentes, bestehend aus Start-Tag, Inhalt des Elementes und End-Tag. An diesen Knoten orientiert sich die Navigation mit den Achsen, siehe unten. | Name des Elements in der Form namespace:tag | alle Texte aller untergeordneten Elementknoten |
| Wurzelknoten root node | Der root node ist ein virtueller Knoten, d.h. er hat kein Pendant im XML-Dokument. Er hat ein Child-Element, das ist das Document-Element (z.B. html, im obigen Beispiel dok). Weitere Child-Knoten (die aber keine Elemente sind) können z.B. Kommentare sein. Die XML-Deklaration und die Doctype-Angabe sind aber keine adressierbaren XML-Objekte in XPath. | keinen | alle Texte aller untergeordneten Elementknoten |
| Textknoten | alle PCDATA- und CDATA-Inhalte eines Elementes werden zu einem Textknoten zusammengefasst. Jedes Element hat maximal einen Textknoten. Wenn der PCDATA-Inhalt durch innere Elemente unterbrochen wurde, wird er zu einem zusammenhängenden Text zusammengefasst. | keinen | Der Text selbst |
| Attributknoten | Alle Attribute außer Namensraumknoten | Name des Attributs in der Form namespace:attribut | Wert des Attributes |
| Namensraumknoten | Angabe eines XML-Namespace mit einem xmlns-Attribut | Namespace-Identifier | Namespace-URI |
| Verarbeitungsanweisungsknoten Processing instructions | Objekte der Form <?pi-name … > | Name der Verarbeitungsanweisung, z.B. xml-stylesheet oder php | alles nach dem Namen |
| Kommentarknoten | Objekte der Form <!-- … --> | keinen | Inhalt des Kommentares |
Achsen
Um bestimmte Knoten auszuwählen, navigiert man entlang bestimmter Pfade in der Baumstruktur. Diese Pfade werden Achsen genannt.
Ähnlich wie bei der Navigation durch Directory-Strukturen gibt es einen Knoten, auf den sich die Pfadangaben beziehen. Dieser Knoten heißt context node. Eine Achse selektiert eine Liste von Knoten, die vom context node aus auf eine bestimmte Art und Weise erreichbar sind.
Genau wie bei absoluten und relativen Pfadangaben in einer Directory-Struktur wird dem XPath-Ausdruck ein Slash / vorangestellt, wenn vom Root-Knoten ausgegangen wird statt vom context node.
Der Syntax ist wie folgt:
- Man schreibt den Namen der Achse,
- dann zwei Doppelpunkte,
- dann den Namen eines Knotens (oder einen anderen Knotentest, siehe unten)
Eine solche Konstruktion nennt man location step.
Jeder XPath-Ausdruck setzt sich aus einem oder mehreren solchen Lokalisierungsschritten zusammen.
Sie werden mit einem Slash / voneinander getrennt.
Der folgende XPath-Ausdruck selektiert drei pa-Elemente des obigen Beispieldokumentes:
/child::dok/child::kap/child::pa
Es gibt auch eine Kurzschreibweise. Bei der verkürzten Notation wird die Achse child:: ganz weggelassen, und für besonders wichtige Achsen gibt es Abkürzungen. Z.B. selektiert man das Elternelement mit zwei Punkten .. statt mit parent::
Obigen Beispielausdruck schreibt man in der Kurznotation einfach
/dok/kap/pa
| Navigationsrichtung | Achse | adressierte Knoten | Abkürzung |
|---|---|---|---|
| ⇓ | child
| direkt untergeordnete Elementknoten | weglassen |
| ⇓ | descendant
| alle untergeordnete Elementknoten, d.h. auch über mehrere Hierarchiestufen | |
| ⇓ | descendant-or-self
| alle untergeordnete Elementknoten inklusive des Kontextknotens | //
|
| ⇑ | parent
| der eine direkt übergeordnete Eltern-Elementknoten | ..
|
| ⇑ | ancestor
| alle übergeordneten Elementknoten, d.h. auch über mehrere Hierarchiestufen | |
| ⇑ | ancestor-or-self
| alle übergeordneten Elementknoten inklusive des Kontextknotens | |
| ⇔ | following-sibling
| nachfolgende Geschwister-Elementknoten, d.h. auf gleicher Ebene | |
| ⇔ | preceding-sibling
| vorhergehende Geschwister-Elementknoten | |
| ⇔ | self
| der context node selbst | .
|
| Reihenfolge | following
| alle nachfolgenden Elementknoten im XML-Dokument, unabhängig von der Hierarchie der Knoten | |
| Reihenfolge | preceding
| alle vorhergehenden Elementknoten im XML-Dokument, unabhängig von der Hierarchie der Knoten | |
| ⇓ | attribute
| alle Attributknoten | @
|
namespace
| alle Namensraumknoten |
Da es nur einen Textknoten gibt, ist keine Achse zur Auswahl eines Textknotens vorgesehen. Die Achsen ancestor, descendant, following, preceding und self partitionieren ein Dokument: sie überschneiden sich nicht und enthalten zusammen alle Knoten des Dokuments.
Knotentests und Prädikate
Knotentests schränken die Elementauswahl einer Achse ein. Schreibweise: Achse::Knotentest
Anschließend können noch Prädikate notiert werden, in denen die Elementauswahl erneut eingeschränkt wird. 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, siehe nachfolgendes Kapitel. Schreibweise: Achse::Knotentest[Ausdruck1][Ausdruck2]
| Knotentest | Erklärung | Beispiel |
|---|---|---|
| elementname oder namespace:elementname | Alle Elementknoten mit Namen elementname und NULL-Namespace Alle Elementknoten mit Namen namespace:elementname | /descendant-or-self::Foowählt alle Elemente im Dokument, die den Namen „Foo“ haben |
| ∗ oder namespace:∗ | Alle Elementknoten Alle Elementknoten im Namespace namespace | /descendant-or-self::Foo/child::∗wählt alle Elemente im Dokument, die Kinder von Elementen mit dem Namen „Foo“ sind. |
| node() | Alle Knoten (also z.B. auch Attributknoten) | |
| text() | Alle Textknoten | /booklist/book/author/text() Der Text aller Elemente im Baum /booklist/book/author |
| processing-instruction() oder processing-instruction(pi-name) | Alle Verarbeitungsanweisungsknoten Alle Verarbeitungsanweisungsknoten mit Expanded-Name pi-name | |
| comment() | Alle Kommentarknoten | |
| [ausdruck] | Alle Knoten, für die der Ausdruck true ist | //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]
|
Attribute und Namensräume werden nicht in Knotentests, sondern als eigene Achse ausgewählt.
Unter XPath interaktive Demo können Sie alle Achsen, Knotentests und Prädikate ausprobieren und XPath-Ausdrücke interaktiv entwickeln.
Ausdrücke
Ausdrücke in XPath liefern Ergebnisse, die einem der folgenden Typen angehören:
- node-set (eine Menge von Knoten, ggf. auch leer)
- boolean (true oder false)
- number (Fließkommazahl)
- string
In Ausdrücken dürfen folgende Sprachelemente verwendet werden:
| Sprachelement | Beispiel | Typ | Notiz |
|---|---|---|---|
| location-steps | /step1/step2 | node-set | siehe Knoten |
| Vereinigungsmenge | node-set1 | node-set2 | node-set | Beliebig viele XPath-Ausdrücke lassen sich mit dem Zeichen | mengenmäßig vereinigen. |
| Strings und Zahlen | "text" 'text' 1 1.2 .1 | string, number | |
| Logik | = != < <= > >= and or | boolean | |
| Klammerung | ( ) | ||
| Arithmetik | + - ∗ div mod | number | |
| Variablen | $Variablenname | ||
| Funktionsaufrufe |
Eine vollständige Liste der Funktionen findet sich in XPath corelib | ||
XPath 2.0
XPath 2.0 was published as a W3C Recommendation on January 23 2007. XPath 2.0 represents a significant increase in the size and capability of the XPath language.
The most notable change is that XPath 2.0 has a much richer type system; XPath 2.0 supports atomic types, defined as built-in types in XML Schema, and may also import user-defined types from a schema. Every value is now a sequence (a single atomic value or node is regarded as a sequence of length one). XPath 1.0 node-sets are replaced by node sequences, which may be in any order.
To support richer type sets, XPath 2.0 offers a greatly expanded set of functions and operators.
XPath 2.0 is in fact a subset of XQuery 1.0. It offers a for expression which is cut-down version of the "FLWOR" expressions in XQuery. It is possible to describe the language by listing the parts of XQuery that it leaves out: the main examples are the query prolog, element and attribute constructors, the remainder of the "FLWOR" syntax, and the typeswitch expression.
Siehe auch
- DOM Document Object Model
- XPointer Weiterentwicklung, bietet weitergehende Adressierungsmöglichkeiten
- XQuery baut auf XPath auf
- XSLT ebenso
- XLink Standardisierte Einbindung von Verweisen in XML-Dokumente
Weblinks
- XPath interaktive Demo XPath-Ausdrücke interaktiv entwickeln
- XPath 1.0 Spezifikation deutsche Übersetzung
- XPath 2.0 Spezifikation
- XLink, XPath, XPointer FH Wedel
- XPath bei SelfHTML
- XPath Tutorial von w3schools
- Galax, frei verfügbare Implementierung für XQuery und XPath 2.0
Dieser Artikel basiert auf dem Artikel XPath aus der freien Enzyklopädie Wikipedia. Er steht unter der GNU-Lizenz für freie Dokumentation. In diesem Wiki und / oder der Wikipedia ist eine Liste der Autoren verfügbar.
Dieser Artikel basiert auf dem Artikel XPath aus der freien Enzyklopädie Wikipedia. Er steht unter der GNU-Lizenz für freie Dokumentation. In diesem Wiki und / oder der Wikipedia ist eine Liste der Autoren verfügbar.