Um XPath-Anfragen mit JDOM durchzuführen, stehen die Typen org.jdom2.xpath. XPathFactory und XPathExpression im Zentrum. Im Hintergrund arbeitet standardmäßig Jaxen. JDOM bringt das nötige Java-Archiv für Jaxen mit. Damit die folgenden Beispiele laufen, muss aus dem Ordner lib des Archivs jdom-xyz.zip die Jar-Datei jaxen.jar in den Klassenpfad aufgenommen werden. Unter http://jaxen.codehaus.org/releases.html lässt sich die jeweils aktuelle Version beziehen, die sich jedoch seit langen nicht mehr aktualisiert hat.
Zu einem XPathFactory-Objekt führt die Fabrikmethode XPathFactory.instance(). Diesem Objekt wird im nächsten Schritt der eigentliche XPath-Ausdruck übergeben: XPathFactory.instance().compile(xpath). Das Ergebnis ist ein XPathExpression-Objekt, welches wir fragen können, welche Knoten in der Ergebnismenge liegen. Der XPath-Ausdruck legt fest, was aus dem XML-Dokument gewünscht ist. Die Liste kann Elemente, Attribute oder Strings enthalten, daher sind keine Typinformationen vorhanden und Generics helfen nicht viel.
Beispiel: Gib die Namen aller Gäste aus:
Listing 1.38: com/tutego/insel/jdom/xpath/XPathDemo1.java, Ausschnitt
XPathExpression<Object> xpath = XPathFactory.instance().compile( "/party/gast/@name" );
List<Object> names = xpath.evaluate( doc );
for ( Object object : names ) {
Attribute attribute = (Attribute) object;
System.out.println( attribute.getValue() );
}
Da es keine Typinformationen gibt, liefert evaluate() immer nur eine Liste von unbekannten Objekten, die von uns in ein über eine explizite Typanpassung in etwas Sinnvolles gebracht werden muss.
Beispiel: Selektiere mit einem XPath-Ausduck die Getränke der Gäste, und gib sie auf den Bildschirm aus:
Listing 1.38: com/tutego/insel/jdom/xpath/XPathDemo2.java, Ausschnitt
XPathExpression<Object> xpath = XPathFactory.instance().compile( "/party/gast/getraenk" );
for ( Object object : xpath.evaluate( doc ) )
System.out.println( ((Element)object).getValue() );
Das Ergebnis dieser beiden Aufrufe ist immer eine Knotenmenge. Es gibt aber auch Situationen, in denen nur das erste Element der Ergebnisliste verarbeitet werden soll oder nur ein Element als Ergebnis bei einem XPath-Ausdruck möglich ist, wie zum Beispiel bei der Abfrage von Elementen mit Index-Angabe. Für diesen Fall bietet die Klasse XPathExpression die praktische Methode evaluateFirst(Object context).
Beispiel: Gib den Namen des ersten Gastes aus:
Listing 1.38: com/tutego/insel/jdom/xpath/XPathDemo3.java, Ausschnitt
XPathExpression<Object> xpath = XPathFactory.instance().compile( "/party/gast[1]/@name" );
Object firstGuest = xpath.evaluateFirst( doc );
System.out.println( ((Attribute) firstGuest).getValue() );
Nutzen von XPath-Ausdrücken
Die Möglichkeiten von XPath können als Alternative zu den Zugriffen über die Datenstrukturen von Java betrachtet werden. Es ist häufig einfacher, mit einem XPath-Ausdruck als mit einzelnen Methodenaufrufen den Pfad zu den Inhalten zu kodieren. Eine Anwendung, die dem Benutzer einen Zugriff auf die XML-Daten bietet, sollte auf jeden Fall XPath anbieten, weil dies der Standard für den Zugriff ist.