- Startseite
- Blog
- XPath verwenden: Daten in XML finden (mit Beispielen)
XPath verwenden: Daten in XML finden (mit Beispielen)
XPath ist eine kleine Sprache, mit der du auf Teile eines XML-Dokuments zeigst, ähnlich wie ein Dateipfad auf eine Datei auf deinem Computer. Statt die ganze Datei zu lesen, schreibst du //book/title und bekommst alle Buchtitel. XPath steckt in XSLT, in Testtools wie Selenium, in Datenimporten, in Konfigurationsdateien und in fast jeder Programmiersprache, die XML liest.
Diese Anleitung zeigt das XPath, das du wirklich brauchst, mit echten Ergebnissen, im kostenlosen XPath-Tester. Alle Beispiele laufen auf dem Beispiel des Testers selbst, du kannst also direkt mitmachen.
Das Beispiel-XML
Ein kleiner Laden mit zwei Büchern:
<shop name="Corner Books">
<book id="bk101" lang="en">
<title>XML & JSON for Everyone</title>
<author>Ada Lovelace</author>
<price currency="EUR">29.95</price>
<inStock>true</inStock>
<tag>data</tag>
<tag>web</tag>
</book>
<book id="bk102" lang="de">
<title>Daten für alle</title>
<author>Alan Turing</author>
<price currency="EUR">24.50</price>
<inStock>false</inStock>
<tag>data</tag>
<discount/>
</book>
</shop>Einen XPath-Ausdruck testen
- Öffne den XPath-Tester. Klicke auf Beispiel, um den Laden oben zu laden, oder füge dein eigenes XML ein bzw. öffne eine Datei.
- Gib einen Ausdruck in XPath-Ausdruck ein. Die Zeile darunter zeigt ✓ Gültiger XPath-Ausdruck, sobald er vollständig ist. Die Schaltflächen bei Probiere: setzen fertige Beispiele ein.
- Drücke Enter oder klicke auf XPath ausführen. Du siehst, wie viele Knoten passen, jeweils mit Typ (Element, Attribut, Text …) und Zeile; ein Klick auf die Zeilennummer springt im XML dorthin.
Die Bausteine
/geht eine Ebene tiefer; am Anfang heißt es „von oben im Dokument“.//sucht in jeder Tiefe.//titlefindet Titel, wo immer sie stehen.@steht für ein Attribut:@idist das Attribut id.[ ]filtert: Nur Knoten, für die die Bedingung stimmt, bleiben übrig.*passt auf jedes Element,.ist der aktuelle Knoten und..sein Elternknoten.
Daten auswählen
//book/title: das title-Element jedes Buchs → 2 Treffer: „XML & JSON for Everyone“ und „Daten für alle“//title/text(): nur der Text in den Titeln → dieselben zwei Texte, ohne Tags//book/@id: das Attribut id jedes Buchs → bk101 und bk102/shop/@name: das Attribut name des obersten Elements → Corner Books//price/@currency: die Währung jedes Preises → EUR und EUR
Mit Bedingungen filtern
//book[@lang='en']/title: Titel der Bücher mit lang=„en“ → XML & JSON for Everyone//book[price > 25]/title: Titel der Bücher, die mehr als 25 kosten → XML & JSON for Everyone//book[tag='web']/author: Autoren der Bücher mit dem Tag „web“ → Ada Lovelace//book[inStock='true']/title: Bücher auf Lager → XML & JSON for Everyone//book[discount]/@id: Bücher, die überhaupt ein discount-Element haben → bk102//title[contains(., 'JSON')]: Titel, die das Wort JSON enthalten → XML & JSON for Everyone//book[1]/author: der Autor des ersten Buchs → Ada Lovelace//book[last()]/title: der Titel des letzten Buchs → Daten für alle//*[not(node())]: leere Elemente, oft ein Fehler → <discount/>
Bedingungen lassen sich mit and und or verbinden, etwa //book[@lang='en' and price > 25].
Zählen und summieren
XPath kann statt Knoten auch einen einzelnen Wert liefern:
count(//book): wie viele Bücher es gibt → 2sum(//price): die Summe aller Preise → 54.45boolean(//book[price > 100]): gibt es ein Buch über 100? → false
Zwei Fehler, die fast alle machen
1. Die Falle mit dem Standard-Namespace
Viele echte Dateien, etwa RSS- und Atom-Feeds, Sitemaps, Office-Dateien und SOAP-Nachrichten, beginnen mit einem Standard-Namespace:
<feed xmlns="http://www.w3.org/2005/Atom">
<entry><title>Hello</title></entry>
</feed>Hier findet //entry/title nichts, weil jedes Element zu diesem Namespace gehört und ein einfacher Name nicht passt. Suche stattdessen über den lokalen Namen: //*[local-name()='entry']/*[local-name()='title']. Der XPath-Tester erkennt diese Situation und weist dich darauf hin.
2. Funktionen aus neueren XPath-Versionen
Browser, Selenium und die meisten Bibliotheken nutzen XPath 1.0. Funktionen aus XPath 2.0 und später wie lower-case(), matches() oder ends-with() gibt es dort nicht. Um Groß- und Kleinschreibung in XPath 1.0 zu ignorieren, nimm translate(); um das Ende eines Werts zu prüfen, vergleiche einen substring().
Kleinere Stolperfallen
- Positionen beginnen bei 1, nicht bei 0:
//book[1]ist das erste Buch. - Textvergleiche sind exakt, mit Groß-/Kleinschreibung und Leerzeichen:
[tag='Web']passt nicht auf „web“. - Anführungszeichen in Anführungszeichen schreibst du jeweils mit der anderen Art:
//book[title="Daten für alle"]oder[title='…'].
Weitere XML-Tools
- XML in JSON und XML in CSV: die ganze Datei umwandeln, sobald du weißt, was drinsteht. Siehe auch XML in JSON umwandeln.
- XML-Formatierer: eine einzeilige Datei zuerst lesbar machen. Der Tester braucht wohlgeformtes XML; siehe XML formatieren und validieren.
Wird mein XML hochgeladen?
Nein. Das XPath läuft in deinem Browser, dein XML verlässt also nie dein Gerät. Unser Server speichert nur, dass ein Test stattfand, für das Tageslimit.
Häufige Fragen
Welche XPath-Version nutzt der Tester?
XPath 1.0, die Version in Browsern, Selenium und den meisten Bibliotheken. Ein Ausdruck, der hier funktioniert, funktioniert also auch dort.
Kann ich XPath für eine Webseite (HTML) testen?
Dieser Tester braucht wohlgeformtes XML, und das sind die meisten Webseiten nicht. Für eine geöffnete Seite nutze die Konsole der Entwicklertools: In Chrome und Edge führt $x("//h1") ein XPath auf der Seite aus.
Warum liefert mein Ausdruck nichts?
Prüfe zuerst, ob es einen Standard-Namespace gibt, dann Groß-/Kleinschreibung und Leerzeichen in Textvergleichen. Beginne mit einem kurzen Pfad wie //book und füge Schritt für Schritt etwas hinzu.
Weitere Artikel
- XML in JSON umwandeln: Attribute, Arrays und Datentypen erklärt
- JSON in CSV umwandeln für Excel und Google Sheets
- Bilder in PDF umwandeln: eine Datei in der richtigen Größe
- Was ist Schema-Markup? Eine einfache Anleitung zu JSON-LD
- QR-Code erstellen, der funktioniert (kostenlos, ohne Ablauf und Anmeldung)