Java XPath Beispiel

XPath Beispiel

XPath ist eine einfache Notation zur Beschreibung eines Knotens (also zur Identifikation eines Elements) in einem XML-Dokument.
Auch Java unterstützt XPath mithilfe einer mächtigen und zugleich einfachen Klassenbibliothek.
Damit kann man auch in Java sehr einfach auf einzelne Knoten in einem XML-Dokument zugreifen.

Wir zeigen hier einige Varianten, wie man sehr einfach mit der Java XPath API auf ein Element im XML-Baum zugreifen kann:

Mit XPath auf ein Element im XML-Baum zugreifen

Wir lesen ein XML-Dokument aus einer Datei (mit der Java XML API für DOM) und greifen gezielt auf ein Element mit einem bestimmten Namen zu:
    final DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    final DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
    final Document doc = docBuilder.parse(new File(args[0]));
    final XPathFactory factory = XPathFactory.newInstance();
    final XPath xpath = factory.newXPath();
    final XPathExpression expr = xpath.compile("/root-element/direktes-Subelement/mein-Element");
    final String elementData = (String)expr.evaluate(doc, XPathConstants.STRING);

XPath-Zugriff auf Element nur durch dessen Name (kein Pfad)

Im zweiten Beispiel greifen wir auf den Inhalt eines Elements zu, ohne dass es uns interessiert, wo im XML-Baum sich dieses Element befindet:
    [...] alles bis auf die letzten zwei Zeilen wie im Beispiel oben
    final XPathExpression expr = xpath.compile("//mein-Element");
    final String elementData = (String)expr.evaluate(doc, XPathConstants.STRING);

Entscheident an dieser Syntax ist, dass wir uns im zweiten Beispiel nicht dafür interessieren müssen, wo in unserem XML-Dokument ein Element mit dem Namen "mein-Element" vorkommt. Wichtig ist nur der Name.
Syntaktisch wird dies durch die beiden vorangestellten Slashes ("//") forciert.

Mehrere Elemente gleichen Namens: laufende Nummer

Falls unser Dokument mehrere Elemente mit dem selben Namen enthält, können wir mit einer fortlaufenden Nummerierung auf jedes beliebige dieser Elemente zugreifen.
Die Zählung beginnt mit der eins - und nicht wie sonst so häufig mit der null, wie es bei Arrays der Fall ist.
Gehen wir davon aus, dass es mehrere Elemente mit dem Namen "mein-Element" geben könnte und uns aber immer nur das allererste interessiert, dann greifen wir wie folgt zu:
    [...] alles bis auf die letzten zwei Zeilen wie im Beispiel oben
    final XPathExpression expr = xpath.compile("//mein-Element[1]");
    final String elementData = (String)expr.evaluate(doc, XPathConstants.STRING);

XPath und SAX Parser?

Bei der Verarbeitung einer großen Anzahl an sehr großen XML Dokumenten besteht eventuell die Gefahr, dass die Verarbeitung von XML-Dateien mittels DOM zu Speicherproblemen führt. In diesen Fällen stellt sich vielleicht die Frage, ob es möglich wäre, XPath mit einem SAX-Parser zu kombinieren.
Die Antwort lautet leider: nein. Das ist es nicht.
Der Grund hierfür liegt darin, dass XPath auf der Tatsache aufsetzt, dass der XML-Baum ggf mehrmals effizient traversiert werden kann. Und das geht eben nur, wenn dieser XML-Baum im Arbeitsspeicher vorgehalten wird. Und damit landen wir unweigerlich bei DOM. SAX spart den Speicherplatz ja gerade dadurch, dass das XML-Dokument nicht ganzheitlich im Arbeitsspeicher liegt - und damit disqualifiziert sich SAX für die Verwendung durch XPath.

Wer also in sehr großen Datenmengen häufig nach einzelnen Elementen suchen muss, sollte aus Speichergründen eventuell auf XPath verzichten und statt dessen mit einem SAX Parser arbeiten.



Nach oben, Inhaltsverzeichnis, Impressum Admin: Artikel editieren