XPath Tester
Testujte XPath výrazy na XML a zobrazte všechny odpovídající uzly
XML vstup
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.
Případy použití XPath testeru
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.
| Osa | Příklad | Popis |
|---|---|---|
| child | child::book | Direct children named "book" |
| descendant | descendant::title | All "title" elements at any depth |
| parent | parent::* | The parent of the current node |
| ancestor | ancestor::catalog | All ancestors named "catalog" |
| following-sibling | following-sibling::book | Siblings after the current node |
| preceding-sibling | preceding-sibling::book | Siblings before the current node |
| attribute | attribute::lang | The "lang" attribute of the node |
| self | self::book | The current node if it is "book" |
| descendant-or-self | //title | Shorthand: any "title" in the tree |
| ancestor-or-self | ancestor-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í.
| Funkce | Kategorie | Popis |
|---|---|---|
| text() | Node test | Selects text content of a node |
| position() | Numeric | Returns 1-based position in node set |
| last() | Numeric | Returns size of current node set |
| count() | Numeric | Counts nodes: count(//book) |
| contains() | String | contains(@class, "active") — substring match |
| starts-with() | String | starts-with(title, "The") — prefix match |
| normalize-space() | String | Strips leading/trailing whitespace |
| string-length() | Numeric | Returns character count of a string |
| sum() | Numeric | sum(//price) — totals numeric values |
| not() | Boolean | not(@disabled) — negation |
| name() | String | Returns 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.
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.98from 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) # → Trueimport 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# 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