XPath Tester

Teste XPath-Ausdrücke gegen XML und sehe alle übereinstimmenden Knoten

Beispiel ausprobieren

XML-Eingabe

Läuft lokal · Sicher zum Einfügen von Secrets

Was ist XPath?

XPath (XML Path Language) ist eine Abfragesprache zum Auswählen von Knoten aus einem XML-Dokument. Vom W3C als Teil des XSLT-Standards definiert, behandelt XPath ein XML-Dokument als Knotenbaum und bietet eine pfadbasierte Syntax zur Navigation in diesem Baum. Ein XPath-Ausdruck wie //book[@category="fiction"]/title wählt jedes title-Element innerhalb eines book-Elements aus, dessen category-Attribut den Wert "fiction" hat. XPath 1.0, die von allen gängigen Browsern und den meisten XML-Bibliotheken unterstützte Version, wurde 1999 als W3C-Empfehlung veröffentlicht und ist nach wie vor die am weitesten verbreitete Version.

XPath-Ausdrücke liefern einen von vier Ergebnistypen: Node-Sets, Strings, Zahlen oder Booleans. Ein Node-Set ist das häufigste Ergebnis und enthält null oder mehr XML-Knoten (Elemente, Attribute, Textknoten, Kommentare oder Verarbeitungsanweisungen). String-, Zahlen- und Boolean-Ergebnisse stammen aus XPath-Funktionen wie count(), sum(), contains() und booleschen Vergleichen. Dieses Typsystem macht XPath sowohl für die Datenextraktion als auch für das Schreiben bedingter Logik in XSLT-Stylesheets und XML-Schema-Assertions geeignet.

Version-1.0-Ausdrücke funktionieren überall: in JavaScript über document.evaluate(), in Python über lxml und ElementTree, in Java über javax.xml.xpath, in PHP über DOMXPath und in Kommandozeilen-Tools wie xmllint. Die Versionen 2.0 und 3.1 bieten reichhaltigere Typsysteme und Funktionen, erfordern aber dedizierte Engines wie Saxon. Verwenden Sie standardmäßig Version 1.0. Greifen Sie auf 2.0 oder 3.1 nur zurück, wenn Sie Sequenzen, reguläre Ausdrücke oder Higher-Order-Funktionen benötigen — und nehmen Sie dann die Abhängigkeit von Saxon oder BaseX in Kauf.

Warum einen Online-XPath-Tester verwenden?

Korrekte Ausdrücke zu schreiben erfordert ein Verständnis der Dokumentstruktur und Tests mit echten Daten. Das Tool bietet eine interaktive Umgebung, um Ausdrücke iterativ zu entwickeln, ohne ein Projekt aufzusetzen oder Boilerplate-Code zu schreiben.

Ausdrücke sofort testen
XML einfügen, einen Ausdruck eingeben und übereinstimmende Knoten in Echtzeit sehen. Kein Kompilierungsschritt, keine REPL-Einrichtung, keine Abhängigkeiten zu installieren.
🔒
Datenschutz an erster Stelle
Das gesamte XML-Parsen und die Auswertung der Abfragen laufen im Browser über die nativen DOMParser- und document.evaluate()-APIs. Ihre XML-Daten verlassen nie Ihren Rechner.
🔍
Komplexe Abfragen Schritt für Schritt debuggen
Zerlegen Sie lange Ausdrücke, indem Sie jede Achse und jedes Prädikat einzeln testen. Sehen Sie genau, welche Knoten bei jedem Schritt übereinstimmen, um Fehler einzugrenzen.
📋
Ergebnisse für die Dokumentation kopieren
Übereinstimmende Knoten oder skalare Ergebnisse mit einem Klick kopieren. Nützlich zum Einfügen in Bug-Reports, Test-Assertions oder Datenextraktionsskripte.

Anwendungsfälle für den XPath Tester

Frontend-Entwickler
XPath-Selektoren für SVG-Manipulation oder XML-basierte Konfiguration testen, bevor sie in JavaScript-Code eingebettet werden, der document.evaluate() aufruft.
Backend-Entwickler
Abfragen gegen SOAP-Antworten oder XML-API-Payloads validieren, bevor Extraktionslogik in Python, Java oder Go geschrieben wird.
DevOps / Infrastruktur
XML-Konfigurationsdateien abfragen (Maven pom.xml, Spring Beans, CI-Pipeline-Configs), um Abhängigkeitsversionen zu extrahieren oder Einstellungen zu prüfen, ohne die Dateien zu bearbeiten.
QA / Testautomatisierung
XPath-Locators für Selenium oder Playwright erstellen und verifizieren, bevor sie in Testskripte übernommen werden. Grenzfälle wie fehlende Attribute oder Namespace-Präfixe testen.
Data Engineer
Abfragen für XML-Datenfeeds (RSS, Atom, XBRL-Finanzberichte) prototypisch entwickeln, bevor sie in ETL-Pipelines eingebunden werden.
Student / Lernender
Mit XPath-Achsen, Prädikaten und Funktionen anhand von Beispiel-XML experimentieren. Ergebnisse sofort sehen, um ein Gefühl für Baumtraversierungsmuster zu entwickeln.

XPath-Achsen-Referenz

Eine Achse definiert die Navigationsrichtung relativ zum aktuellen (Kontext-)Knoten. Die vollständige Syntax lautet axis::node-test[predicate], obwohl die meisten Entwickler täglich die abgekürzten Formen (//, @, ..) verwenden. Diese Tabelle listet alle 1.0-Achsen mit praktischen Beispielen auf.

AchseBeispielBeschreibung
childchild::bookDirect children named "book"
descendantdescendant::titleAll "title" elements at any depth
parentparent::*The parent of the current node
ancestorancestor::catalogAll ancestors named "catalog"
following-siblingfollowing-sibling::bookSiblings after the current node
preceding-siblingpreceding-sibling::bookSiblings before the current node
attributeattribute::langThe "lang" attribute of the node
selfself::bookThe current node if it is "book"
descendant-or-self//titleShorthand: any "title" in the tree
ancestor-or-selfancestor-or-self::*Current node plus all ancestors

XPath-1.0-Funktionen

Die Sprache definiert 27 eingebaute Funktionen in vier Kategorien: Node-Set, String, Zahl und Boolean. Dies sind die Funktionen, die Sie beim Schreiben von Abfragen am häufigsten verwenden werden. Alle werden von diesem Tester und von jeder konformen Implementierung unterstützt.

FunktionKategorieBeschreibung
text()Node testSelects text content of a node
position()NumericReturns 1-based position in node set
last()NumericReturns size of current node set
count()NumericCounts nodes: count(//book)
contains()Stringcontains(@class, "active") — substring match
starts-with()Stringstarts-with(title, "The") — prefix match
normalize-space()StringStrips leading/trailing whitespace
string-length()NumericReturns character count of a string
sum()Numericsum(//price) — totals numeric values
not()Booleannot(@disabled) — negation
name()StringReturns element or attribute name

Code-Beispiele

Diese Beispiele zeigen, wie Ausdrücke programmatisch ausgewertet werden. Jeder Code-Ausschnitt verwendet dieselbe catalog.xml-Struktur, sodass Sie die API-Unterschiede zwischen den Sprachen vergleichen können.

JavaScript (browser)
const xml = `<catalog>
  <book id="1"><title>1984</title><price>7.99</price></book>
  <book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>`

const parser = new DOMParser()
const doc = parser.parseFromString(xml, 'application/xml')

// Select all book titles
const result = doc.evaluate('//book/title', doc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null)
let node = result.iterateNext()
while (node) {
  console.log(node.textContent) // → "1984", "Dune"
  node = result.iterateNext()
}

// Get a numeric value
const sum = doc.evaluate('sum(//price)', doc, null, XPathResult.NUMBER_TYPE, null)
console.log(sum.numberValue) // → 20.98
Python (lxml)
from lxml import etree

xml = """<catalog>
  <book id="1"><title>1984</title><price>7.99</price></book>
  <book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>"""

tree = etree.fromstring(xml.encode())

# Select elements by attribute
books = tree.xpath('//book[@id="1"]/title/text()')
print(books)  # → ['1984']

# Use predicates with position
first = tree.xpath('//book[1]/title/text()')
print(first)  # → ['1984']

# Boolean check
has_cheap = tree.xpath('boolean(//price[. < 10])')
print(has_cheap)  # → True
Java (javax.xml.xpath)
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import org.w3c.dom.*;

var factory = DocumentBuilderFactory.newInstance();
var builder = factory.newDocumentBuilder();
var doc = builder.parse(new java.io.File("catalog.xml"));

var xpath = XPathFactory.newInstance().newXPath();

// Select node set
NodeList titles = (NodeList) xpath.evaluate(
    "//book/title", doc, XPathConstants.NODESET
);
for (int i = 0; i < titles.getLength(); i++) {
    System.out.println(titles.item(i).getTextContent());
    // → "1984", "Dune"
}

// Evaluate to number
double total = (double) xpath.evaluate(
    "sum(//price)", doc, XPathConstants.NUMBER
);
System.out.println(total); // → 20.98
CLI (xmllint)
# Select all book titles
xmllint --xpath '//book/title/text()' catalog.xml
# → 1984Dune

# Select by attribute
xmllint --xpath '//book[@id="2"]/title' catalog.xml
# → <title>Dune</title>

# Count nodes
xmllint --xpath 'count(//book)' catalog.xml
# → 2

# Using xmlstarlet for formatted output
xmlstarlet sel -t -v '//book/title' -n catalog.xml
# → 1984
# → Dune

Häufig gestellte Fragen

Was ist der Unterschied zwischen XPath 1.0 und XPath 3.1?
Version 1.0 hat vier Datentypen (Node-Set, String, Zahl, Boolean) und 27 Funktionen. Version 3.1 fügt Sequenzen, Maps, Arrays, Datum-/Uhrzeittypen, reguläre Ausdrücke, Higher-Order-Funktionen und JSON-Unterstützung hinzu. Browser und die meisten Standardbibliotheken implementieren nur Version 1.0. Version 3.1 erfordert eine dedizierte Engine wie Saxon.
Wie wähle ich Knoten mit einem bestimmten Attributwert aus?
Verwenden Sie ein Prädikat mit der @-Kurzschreibweise für die Attributachse. Zum Beispiel wählt //book[@category="fiction"] alle book-Elemente aus, bei denen das category-Attribut den Wert "fiction" hat. Sie können mehrere Prädikate kombinieren: //book[@category="fiction"][@year > 2000].
Warum liefert mein XPath keine Ergebnisse, obwohl das XML übereinstimmende Elemente enthält?
Die häufigste Ursache sind XML-Namensräume. Wenn Ihr XML einen Standard-Namensraum deklariert (xmlns="..."), gehören Elemente zu diesem Namensraum, auch ohne Präfix. In Version 1.0 müssen Sie den Namensraum registrieren und in Ihrem Ausdruck ein Präfix verwenden. In Browser-JavaScript übergeben Sie einen Namespace-Resolver als drittes Argument an document.evaluate().
Kann XPath XML-Inhalte ändern?
Nein. Es ist eine nur lesende Abfragesprache. Sie wählt Knoten aus und wertet sie aus, kann sie aber weder einfügen, löschen noch aktualisieren. Um XML zu ändern, verwenden Sie XSLT-Transformationen, DOM-Manipulationsmethoden oder eine Bibliothek wie Pythons lxml, die separate APIs zum Bearbeiten bereitstellt.
Was bedeutet der doppelte Schrägstrich (//) in XPath?
Der doppelte Schrägstrich ist eine Kurzschreibweise für die descendant-or-self-Achse. Der Ausdruck //title bedeutet: "Alle title-Elemente an beliebiger Stelle im Dokumentbaum, auf jeder Tiefenebene, auswählen." Er entspricht der vollständigen Form /descendant-or-self::node()/title. // am Anfang eines Ausdrucks durchsucht das gesamte Dokument; in der Mitte eines Pfads (wie /catalog//title) durchsucht es die Nachkommen eines bestimmten Knotens.
Wie wähle ich Textinhalt statt des Elementknotens aus?
Hängen Sie /text() an Ihren Ausdruck an. Zum Beispiel gibt //book/title/text() den Textinhalt jedes title-Elements als String-Knoten zurück, anstatt des Elementknotens selbst. Im Code können Sie auch .textContent am zurückgegebenen Elementknoten aufrufen, ohne text() zu verwenden.
Ist XPath schneller als CSS-Selektoren für XML-Abfragen?
CSS-Selektoren sind für HTML und DOM-Traversierung in Browsern optimiert. XPath ist ausdrucksstärker: Es unterstützt Eltern-Traversierung, Geschwister-Achsen, numerische Prädikate und eingebaute Funktionen, die CSS-Selektoren nicht ausdrücken können. Für HTML sind CSS-Selektoren (querySelector) in der Regel schneller. Für XML bieten die meisten serverseitigen Bibliotheken ausschließlich XPath — CSS-Selektoren sind dort keine Option.