XPath Tester

Testujte XPath výrazy na XML a zobrazte všechny odpovídající uzly

Zkusit příklad

XML vstup

Běží lokálně · Bezpečné pro vkládání tajných údajů

Co je XPath?

XPath (XML Path Language) je dotazovací jazyk pro výběr uzlů z XML dokumentu. Definovaný W3C jako součást standardu XSLT, XPath pracuje s XML dokumentem jako se stromem uzlů a poskytuje syntaxi založenou na cestách pro procházení tohoto stromu. XPath výraz jako //book[@category="fiction"]/title vybere každý prvek title uvnitř prvku book, jehož atribut category se rovná "fiction". XPath 1.0, verze podporovaná všemi hlavními prohlížeči a většinou XML knihoven, byl publikován jako doporučení W3C v roce 1999 a zůstává nejrozšířenější verzí.

XPath výrazy vrací jeden ze čtyř typů výsledků: sady uzlů, řetězce, čísla nebo booleany. Sada uzlů je nejčastějším výsledkem a obsahuje nula nebo více XML uzlů (elementy, atributy, textové uzly, komentáře nebo instrukce pro zpracování). Výsledky typu řetězec, číslo a boolean pocházejí z XPath funkcí jako count(), sum(), contains() a booleanovských porovnání. Tento typový systém činí XPath vhodným jak pro extrakci dat, tak pro psaní podmíněné logiky v XSLT šablonách a asercích XML Schema.

Výrazy verze 1.0 fungují všude: JavaScript's document.evaluate(), Python's lxml a ElementTree, Java's javax.xml.xpath, PHP's DOMXPath a nástroje příkazové řádky jako xmllint. Verze 2.0 a 3.1 přidávají bohatší typové systémy a funkce, ale vyžadují specializované enginy jako Saxon. Používejte verzi 1.0 jako výchozí. Sáhněte po verzi 2.0 nebo 3.1 pouze tehdy, když potřebujete sekvence, regulární výrazy nebo funkce vyšších řádů — a přijměte závislost na Saxon nebo BaseX.

Proč použít online XPath tester?

Psaní správných výrazů vyžaduje porozumění struktuře dokumentu a testování na reálných datech. Nástroj vám poskytuje interaktivní prostředí pro iteraci výrazů bez nutnosti nastavovat projekt nebo psát inicializační kód.

Testování výrazů okamžitě
Vložte XML, napište výraz a zobrazte odpovídající uzly v reálném čase. Žádný krok kompilace, žádné nastavení REPL, žádné závislosti k instalaci.
🔒
Zpracování zaměřené na soukromí
Veškerá analýza XML a vyhodnocení dotazů probíhá ve vašem prohlížeči pomocí nativních API DOMParser a document.evaluate(). Vaše XML data nikdy neopustí váš počítač.
🔍
Ladění složitých dotazů krok za krokem
Rozkládejte dlouhé výrazy testováním každé osy a predikátu zvlášť. Přesně zjistěte, které uzly odpovídají v každém kroku, abyste izolovali chyby.
📋
Kopírování výsledků pro dokumentaci
Zkopírujte odpovídající uzly nebo skalární výsledky jedním kliknutím. Užitečné pro vkládání do hlášení chyb, testovacích asercí nebo skriptů pro extrakci dat.

Případy použití XPath testeru

Frontend vývojář
Testujte XPath selektory pro manipulaci SVG nebo konfigurace v XML před jejich vložením do JavaScript kódu, který volá document.evaluate().
Backendový inženýr
Ověřujte dotazy na odpovědi SOAP nebo XML API payloady před psaním logiky extrakce v Pythonu, Javě nebo Go.
DevOps / Infrastruktura
Dotazujte XML konfigurační soubory (Maven pom.xml, Spring beans, konfigurace CI pipeline) pro extrakci verzí závislostí nebo ověření nastavení bez úpravy souborů.
QA / Automatizace testů
Sestavujte a ověřujte XPath lokátory pro Selenium nebo Playwright před jejich přidáním do testovacích skriptů. Testujte okrajové případy jako chybějící atributy nebo předpony jmenných prostorů.
Datový inženýr
Prototypujte dotazy pro XML datové zdroje (RSS, Atom, finanční výkazy XBRL) před jejich zapojením do ETL pipeline.
Student / začátečník
Experimentujte s XPath osami, predikáty a funkcemi na vzorových XML datech. Okamžitě zobrazte výsledky a budujte intuici pro vzory procházení stromem.

Přehled XPath os

Osa definuje směr navigace relativně k aktuálnímu (kontextovému) uzlu. Úplná syntaxe je axis::node-test[predicate], ačkoli většina vývojářů denně používá zkrácené formy (//, @, ..). Tato tabulka uvádí všechny osy verze 1.0 s praktickými příklady.

OsaPříkladPopis
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

Funkce XPath 1.0

Jazyk definuje 27 vestavěných funkcí ve čtyřech kategoriích: sada uzlů, řetězec, číslo a boolean. Tyto funkce budete nejčastěji používat při psaní dotazů. Všechny jsou podporovány tímto testerem i každou vyhovující implementací.

FunkceKategoriePopis
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

Příklady kódu

Tyto příklady ukazují, jak programově vyhodnocovat výrazy. Každá ukázka používá stejnou strukturu catalog.xml, takže můžete porovnat rozdíly API napříč jazyky.

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

Často kladené otázky

Jaký je rozdíl mezi XPath 1.0 a XPath 3.1?
Verze 1.0 má čtyři datové typy (sada uzlů, řetězec, číslo, boolean) a 27 funkcí. Verze 3.1 přidává sekvence, mapy, pole, typy data/času, regulární výrazy, funkce vyšších řádů a podporu JSON. Prohlížeče a většina standardních knihoven implementují pouze verzi 1.0. Verze 3.1 vyžaduje specializovaný engine jako Saxon.
Jak vybrat uzly s konkrétní hodnotou atributu?
Použijte predikát se zkratkou @ pro osu atributu. Například //book[@category="fiction"] vybere všechny prvky book, kde se atribut category rovná "fiction". Můžete kombinovat více predikátů: //book[@category="fiction"][@year > 2000].
Proč můj XPath nevrací žádné výsledky, přestože XML obsahuje odpovídající prvky?
Nejčastější příčinou jsou jmenné prostory XML. Pokud vaše XML deklaruje výchozí jmenný prostor (xmlns="..."), prvky patří do tohoto jmenného prostoru i bez předpony. Ve verzi 1.0 musíte zaregistrovat jmenný prostor a použít předponu ve výrazu. V prohlížečovém JavaScriptu předejte překladač jmenných prostorů jako třetí argument funkci document.evaluate().
Může XPath upravovat obsah XML?
Ne. Je to pouze dotazovací jazyk pro čtení. Vybírá a vyhodnocuje uzly, ale nemůže je vkládat, mazat ani aktualizovat. Pro úpravu XML použijte transformace XSLT, metody manipulace DOM nebo knihovnu jako Python's lxml, která poskytuje samostatná API pro úpravy.
Co znamená dvojité lomítko (//) v XPath?
Dvojité lomítko je zkratka pro osu descendant-or-self. Výraz //title znamená "vybrat všechny prvky title kdekoli ve stromu dokumentu, v libovolné hloubce." Je ekvivalentem plného zápisu /descendant-or-self::node()/title. Použití // na začátku výrazu prohledá celý dokument; použití uprostřed cesty (jako /catalog//title) prohledá potomky konkrétního uzlu.
Jak vybrat textový obsah místo uzlu elementu?
Přidejte /text() ke svému výrazu. Například //book/title/text() vrátí textový obsah každého prvku title jako textový uzel, nikoli samotný prvek. V kódu můžete také přistupovat k .textContent na vráceném uzlu elementu bez použití text().
Je XPath rychlejší než CSS selektory pro dotazování XML?
CSS selektory jsou optimalizovány pro HTML a procházení DOM v prohlížečích. XPath je výrazovější: podporuje procházení rodičem, osy sourozenců, číselné predikáty a vestavěné funkce, které CSS selektory nedokáží vyjádřit. Pro HTML jsou CSS selektory (querySelector) typicky rychlejší. Pro XML většina serverových knihoven nabízí pouze XPath — CSS selektory tam vůbec nejsou dostupné.