XML-Know How

XPath zur Navigation in XML-Dokumenten

Entsprechend können beliebig lange XPath-Ausdrücke zusammengestellt werden:

Beispiel:

/kochbuch/kapitel/rezept

wählt beispielsweise alle Rezepte (und nur diese) aus dem Kochbuch aus.

Im Beispiel haben wir die Selektion von Elementknoten gesehen. Auch Attributknoten können mit XPath angesteuert werden. Da Attribute im XPath-Sinne keine Kinder von Elementen sind, kann hier nicht mit der bereits bekannten Kind-Achse gearbeitet werden. Vielmehr bedarf es einer speziellen Achse, um Attribute selektieren zu können. Das At-Zeichen »@« steht für die abgekürzte Schreibweise der Attributachse in XPath. Auch das wollen wir anhand eines Beispiels verdeutlichen:

Es sollen die Kategorien aller Rezepte selektiert werden. Dies geschieht mit folgendem XPath-Ausdruck:

Beispiel:

/kochbuch/kapitel/rezept/@kategorie

Da in unserem Beispiel alle Rezepte mit einer Kategorie versehen wurden, erhält man eine Ergebnismenge von Attributwerten, die gleich groß ist wie die Anzahl der Rezepte:

hauptgericht

vorspeise

Abhängig von der Hierarchietiefe und -breite eines XML-Dokuments erhält man als Ergebnismenge eines XPath-Ausdrucks unter Umständen eine sehr große Menge an Ergebnisknoten.

Prädikate

Um eine Knotenmenge eines XPath-Ausdrucks nach bestimmten Kriterien zu filtern, kommen Prädikate zum Einsatz. Ein erstes Beispiel für die Verwendung eines Prädikats soll die Einschränkung der Ergebnismenge aufgrund der Position eines Knotens sein. Soll beispielsweise nur das erste Rezept des Kochbuchs selektiert werden, müssen zunächst alle Rezepte ausgewählt und dann durch ein Prädikat gefiltert werden. Die dazugehörige XPath-Syntax lautet:

Beispiel:

/kochbuch/kapitel/rezept[1]

Die eckigen Klammern kennzeichnen ein Prädikat, die Ziffer darin die auszuwählende Position des zu selektierenden Rezepts.

Die Mächtigkeit von Prädikaten ist enorm und bei weitem nicht nur auf Positionsangaben beschränkt. So lassen sich auch boolesche und numerische Vergleiche, aber auch Vergleiche auf Stringebene durchführen. Eine entsprechende Anfrage an unsere Musterinstanz wäre die Frage nach allen vegetarischen Rezepten (also nach allen Elementen »rezept«, deren Attribut »typ« den Wert »vegetarisch« hat). Folgender XPath-Ausdruck könnte diese Anfrage an das XML-Dokument richten:

/kochbuch/kapitel/rezept[@typ="vegetarisch"]

Nach dem gleichen Prinzip können z. B. die Zutaten aller Rezepte selektiert werden, deren Kalorienanzahl größer als 1000 ist. Folgender XPath-Ausdruck leistet diese Anfrage:

/kochbuch/kapitel/rezept[@kalorien>1000]/zutaten

Durch die Verknüpfung von Prädikaten können Filter noch feiner spezifiziert werden. Das nachfolgende Beispiel selektiert alle Überschriften von Hauptspeisen, die einfach zuzubereiten sind:

/kochbuch/kapitel/rezept[@aufwand="niedrig"] [@kategorie=" hauptgericht"]/ueberschrift1