Was ist dieses Tool?
XPath (XML Path Language) ist ein W3C-Standard zum Navigieren und Auswählen von Knoten — Elementen, Attributen, Text — innerhalb eines XML-Dokuments über eine kompakte, pfadähnliche Syntax, z. B. wählt `//book[price>30]/title` jedes `<title>` aus, dessen Geschwisterelement `<price>` größer als 30 ist, egal wo im Dokument. Verwendet wird XPath von XSLT-Stylesheets, XML-Validierungswerkzeugen, Web-Scrapern, Browser-Automatisierungs-Frameworks (Selenium, Playwright) sowie den XML-Bibliotheken vieler Programmiersprachen.
Die aktuelle Version, die von allen großen Browsern — Chrome, Firefox, Safari, Edge — implementiert wird, ist XPath 1.0, die ursprüngliche W3C-Empfehlung von 1999. Dieses Tool nutzt genau diese native Engine über die `document.evaluate()`-API des Browsers, sodass die Ergebnisse exakt dem entsprechen, was man über die Browser-DevTools oder über JavaScript im Browser erhält. Die späteren Spezifikationen XPath 2.0/3.0/3.1 (die Funktionen wie `for`, Sequenzen und Regex-Vergleiche hinzufügen) werden nicht implementiert — was das in der Praxis bedeutet, steht in den FAQ.
Ein Ausdruck kann eines von zwei Ergebnistypen liefern: eine Knotenmenge (node-set — null oder mehr passende Elemente, Attribute oder Textknoten, die dieses Tool serialisiert und zeilenweise zusammen mit einer Trefferzahl auflistet), oder einen skalaren Wert — eine Zahl, eine Zeichenkette oder einen booleschen Wert —, wenn der Ausdruck selbst einen Wert berechnet, wie `count(//book)` oder `//book[1]/title = 'Dune'`.
Warum sollte man es nutzen?
- Einen XPath-Ausdruck testen, bevor er fest in einen Web-Scraper, einen Selenium-/Playwright-Test oder ein XSLT-Stylesheet eingebaut wird.
- Schnell prüfen, ob ein bestimmter XPath-Ausdruck an einer echten XML-/HTML-Probe wirklich den erwarteten Knoten auswählt.
- Exakte Trefferzahlen und serialisierte Ausgabe einsehen, statt anhand des Codes zu raten.
- Sofortige, verständliche Fehlermeldungen bei fehlerhaftem XML oder ungültiger XPath-Syntax erhalten, statt eines kryptischen Stack-Trace.
- 100 % clientseitig: dein XML und dein Ausdruck verlassen niemals deinen Browser.
Anleitung
- Füge dein XML (oder HTML) im Eingabefeld ein oder bearbeite es — ein Beispiel-Dokument einer Buchhandlung ist bereits vorausgefüllt, damit du sofort siehst, wie es funktioniert.
- Gib einen XPath-Ausdruck im Ausdrucksfeld ein, oder bearbeite das vorausgefüllte Beispiel.
- Klicke auf „Auswerten“ (oder drücke im Ausdrucksfeld die Eingabetaste).
- Lies die passenden Knoten weiter unten, mit der Trefferzahl oben; skalare Ergebnisse (Zahlen, Zeichenketten, boolesche Werte) werden direkt angezeigt.
- Sind XML oder Ausdruck ungültig, erscheint anstelle der Ergebnisse eine konkrete Fehlermeldung.
Beispiel
Eingabe
XML:
<bookstore>
<book><title>The Great Gatsby</title><price>12.99</price></book>
<book><title>Learning XPath</title><price>34.50</price></book>
<book><title>Dune</title><price>45.00</price></book>
</bookstore>
XPath: //book[price>30]/titleAusgabe
✓ 2 node(s) matched
<title>Learning XPath</title>
<title>Dune</title>Nur 2 der 3 Bücher haben einen Preis über 30, daher werden genau 2 <title>-Elemente zurückgegeben — das dritte Buch (Gatsby, 12,99 $) wird korrekt ausgeschlossen.
XPath und CSS-Selektoren im Vergleich
Beide Sprachen wählen Knoten aus einem Dokument aus, lösen aber unterschiedliche Probleme. Nutze diese Tabelle, um für eine gegebene Auswahl das richtige Werkzeug zu finden.
| Fähigkeit | XPath | CSS-Selektoren |
|---|---|---|
| Auswahl nach Tag/Klasse/ID abwärts | Ja | Ja — und meist schneller |
| Auswahl nach sichtbarem/Text-Inhalt | Ja — `contains(text(),'x')` | Nein |
| Aufwärts zu Eltern-/Vorfahrenelement navigieren | Ja — `//div[span]/..` | Nein (`:has()` ist eine neuere, teilweise Ausnahme) |
| Vergleiche zwischen Geschwisterwerten (z. B. `price>30`) | Ja | Nein |
| Funktioniert außerhalb des Browsers (serverseitige XML-Tools, XSLT) | Ja | Nein — CSS-Selektoren sind browser-/DOM-spezifisch |
Verwandte Tools
Arbeitest du mit strukturierten Datenformaten? Diese Tools passen gut zum XPath-Testen.
Häufig gestellte Fragen
Wofür wird XPath verwendet?
XPath wählt Knoten — Elemente, Attribute oder Text — aus einem XML- oder HTML-Dokument über eine pfadartige Syntax aus. Es ist die Auswahlsprache hinter XSLT-Transformationen und vielen XML-Validatoren und wird häufig beim Web-Scraping sowie in der Browser-Testautomatisierung (Selenium, Playwright, Cypress) eingesetzt, um Elemente auf einer Seite zu finden — besonders dann, wenn CSS-Selektoren allein die benötigte Bedingung nicht ausdrücken können.
XPath oder CSS-Selektoren — was sollte ich verwenden?
Sie überschneiden sich, sind aber nicht gleichwertig. XPath kann ein Elternelement anhand des Inhalts eines Kindelements auswählen (`//div[span='Total']`), aufwärts zu Vorfahren navigieren und anhand des sichtbaren Textes auswählen (`//button[contains(text(),'Submit')]`) — CSS-Selektoren können im Baum nicht nach oben gehen und überhaupt nicht auf Textinhalt matchen. Wenn du nur nach Tag, Klasse oder ID abwärts durch das Dokument auswählst, sind CSS-Selektoren einfacher zu schreiben und in der Regel schneller auszuwerten. Greife gezielt zu XPath, wenn du „das Elternelement dieses Textes auswählen“ oder „nach dem, was das Element aussagt, auswählen“ musst — nicht nur nach Tag oder Klasse.
Unterstützt dieses Tool Funktionen von XPath 2.0 oder 3.0?
Nein — das tut kein Browser. Browser implementieren XPath 1.0 (die W3C-Empfehlung von 1999) über `document.evaluate()`, und dieses Tool nutzt genau diese native Engine, sodass es exakt dem entspricht, was man beim Ausführen desselben Ausdrucks in den Browser-DevTools oder in JavaScript bekäme. Funktionen und Features aus XPath 2.0/3.0/3.1 (wie `for`-Ausdrücke, Sequenzen oder `matches()` mit Regex) stehen nicht zur Verfügung — hier funktionieren nur 1.0-Funktionen wie `contains()`, `starts-with()`, `substring()`, `count()`, `position()` und `last()`.
Welche gängigen XPath-Ausdrücke sollte ich kennen?
`//tag` wählt jedes `<tag>` irgendwo im Dokument aus. `//tag[@attr='value']` wählt `<tag>`-Elemente aus, deren Attribut `attr` gleich `value` ist. `//tag[contains(text(),'x')]` wählt `<tag>`-Elemente aus, deren direkter Text `x` enthält. `//tag[1]` wählt das jeweils erste `<tag>`-Geschwisterelement innerhalb jedes Elternelements aus. `//parent/child` wählt `<child>`-Elemente aus, die direkte Kinder von `<parent>` sind. `count(//tag)` liefert eine Zahl statt einer Knotenmenge.
Unterstützt dieses Tool XML-Namespaces?
Sauber unterstützt wird nur der übliche Fall ohne Namespace, der den Großteil von handgeschriebenem oder gescraptem XML/HTML abdeckt. Deklariert dein Dokument einen XML-Namespace (z. B. `xmlns="..."` am Wurzelelement), benötigt `document.evaluate` eine namespace-bewusste Resolver-Funktion, die Präfixe auf URIs abbildet — das richtet dieses einfache Tool nicht ein. Ausdrücke gegen XML mit Namespace können daher null Treffer liefern, selbst wenn sie korrekt aussehen. Das ist eine bekannte Einschränkung, kein Bug: entferne die Namespace-Deklaration aus deiner Probe, oder nutze als Workaround die Funktion local-name() (z. B. `//*[local-name()='title']`).
Werden mein XML oder mein XPath-Ausdruck an einen Server gesendet?
Nein. Alles läuft lokal über den fest im Browser eingebauten `DOMParser` und `document.evaluate()` — dieselbe Engine, die dein Browser ohnehin intern verwendet. Nichts von dem, was du eingibst oder einfügst, verlässt jemals dein Gerät.