XPath

Klippstein IT Service

Aus 4webmaster.de

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

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.

XML-Baumstruktur
XML-Baumstruktur

Beispiele für XPath-Ausdrücke:

  • /dok selektiert das Document-Element dok
  • /∗ selektiert das Document-Element unabhängig vom Namen (jedes wohlgeformte XML-Dokument hat genau ein Document-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“.
  • child::∗ selektiert Alle Kindelemente des gegenwärtigen Knotens
  • child::pa Alle 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:

  1. Man schreibt den Namen der Achse,
  2. dann zwei Doppelpunkte,
  3. 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::Foo
wä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
  • Zeichenkettenfunktionen:
    • normalize-space() - Entfernen von Leerzeichen am Anfang und Ende des Strings
      und Reduktion aufeinanderfolgender Spaces auf eines
    • substring() - Einen Teilstring selektieren
    • string-length() - Länge des Strings
  • Knotenmengen-Funktionen:
    • count() - Anzahl der Knoten in einer Knotenmenge
    • id() - Selektiert Elemente über ihre ID
    • name() - Name des Knotens

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





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.


Persönliche Werkzeuge