XML-Know How

XPath zur Navigation in XML-Dokumenten

Mit Hilfe dieser Syntax können nun schon erste komplexere Anfragen an ein XML-Dokument gestellt werden. In unserem Beispiel sollen etwa alle Orte (und nur die Orte) des Adressenverzeichnisses ausgewählt werden, was folgender XPath-Ausdruck leistet[1]:

        /adressenliste/adresse/ort[2]

An der Beispielinstanz wird sehr schnell der Unterschied zu Dateibäumen deutlich. Während Verzeichnisse auf gleicher Ebene immer nur eindeutig benannt sein dürfen, ist es in XML erlaubt, gleich strukturierte Elementgruppen auch gleich zu benennen. So existieren im obigen Beispiel drei Elemente mit dem Namen „adresse“ (und somit auch drei Orte innerhalb dieser drei Adressen).

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 Adressen selektiert werden. Dies geschieht mit folgendem XPath-Ausdruck:

Dabei steht der Slash „/“ für den Wurzelknoten (1). Gefolgt vom Elementnamen „adressenliste“ ändert sich der Kontextknoten (der ausgewählte Knoten) auf die nächsttiefere Ebene, nämlich auf das Element „adressenliste“ (2). Der Slash signalisiert wieder einen weiteren Sprung und alle Elemente „adresse“ werden ausgewählt (3). Das „@“-Zeichen signalisiert einen Sprung auf die Attribut-
achse und „kat“ gibt an, welches Attribut selektiert werden soll (4).

 

 

 

 

 

 

 

 

 

 

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. 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 nun, anders als im obigen Beispiel, nur die erste Adresse der Adressenliste selektiert werden, müssen zunächst alle Adressen ausgewählt und dann durch ein Prädikat gefiltert werden. Die dazugehörige XPath-Syntax lautet:

         /adressenliste/adresse[1]

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

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 Dienstadressen (also nach allen Elementen „adresse“, deren Attribut „kat“ den Wert „dienst“ hat). Folgender XPath-Ausdruck könnte diese Anfrage an das XML-Dokument richten:

         /adressenliste/adresse[@kat="dienst"].

Nach dem gleichen Prinzip können alle Orte selektiert werden, deren dazugehörige PLZ größer als 90000 ist. Folgender XPath-Ausdruck leistet diese Anfrage:

         /adressenliste/adresse[plz>90000]/ort.

Durch die Verknüpfung von Prädikaten können Filter noch feiner spezifiziert werden. Beispiel: Selektiere alle Namen der Personen, deren Dienstadressen eine PLZ kleiner als 80000 haben:

         /adressenliste/adresse[@kat="dienst"][plz<80000]/name


     

  1. ↑  Um Missverständnissen vorzubeugen sei an dieser Stelle nochmals darauf hingewiesen, dass der XPath-Ausdruck selbst nicht die Auswahl der Orte vornehmen kann, sondern lediglich ein anderes Programm (z. B. einen XSLT-Prozessor) mit der notwendigen Information für die Auswahl versorgt, und zwar in standardisierter Notation.
  2. ↑  Für dieses Beispiel kann auch die abkürzende Form „//ort“ zum Einsatz kommen, die jedoch aufgrund ihrer fehlenden Berücksichtigung der Hierarchien mit Bedacht einzusetzen ist.
  3.