Tester XPath
Testuj wyrażenia XPath dla XML i zobacz wszystkie pasujące węzły
Wejście XML
Czym jest XPath?
XPath (XML Path Language) to język zapytań służący do wybierania węzłów z dokumentu XML. Zdefiniowany przez W3C jako część standardu XSLT, XPath traktuje dokument XML jako drzewo węzłów i udostępnia składnię opartą na ścieżkach do nawigacji po tym drzewie. Wyrażenie XPath takie jak //book[@category="fiction"]/title wybiera każdy element title wewnątrz elementu book, którego atrybut category ma wartość "fiction". XPath 1.0 — wersja obsługiwana przez wszystkie główne przeglądarki i większość bibliotek XML — został opublikowany jako zalecenie W3C w 1999 roku i pozostaje najszerzej stosowaną wersją.
Wyrażenia XPath zwracają jeden z czterech typów wyników: zestawy węzłów, stringi, liczby lub wartości logiczne. Zestaw węzłów to najczęstszy wynik — zawiera zero lub więcej węzłów XML (elementy, atrybuty, węzły tekstowe, komentarze lub instrukcje przetwarzania). Wyniki w postaci stringów, liczb i wartości logicznych pochodzą z funkcji XPath, takich jak count(), sum(), contains() oraz porównań logicznych. Ten system typów sprawia, że XPath nadaje się zarówno do wyodrębniania danych, jak i do pisania logiki warunkowej w arkuszach stylów XSLT i asercjach XML Schema.
Wyrażenia wersji 1.0 działają wszędzie: w JavaScript przez document.evaluate(), w Pythonie przez lxml i ElementTree, w Javie przez javax.xml.xpath, w PHP przez DOMXPath oraz w narzędziach wiersza poleceń, takich jak xmllint. Wersje 2.0 i 3.1 dodają bogatsze systemy typów i funkcje, ale wymagają dedykowanych silników, takich jak Saxon. Domyślnie stosuj wersję 1.0. Po wersje 2.0 lub 3.1 sięgaj tylko wtedy, gdy potrzebujesz sekwencji, wyrażeń regularnych lub funkcji wyższego rzędu — i akceptujesz zależność od Saxon lub BaseX.
Dlaczego warto używać internetowego testera XPath?
Pisanie poprawnych wyrażeń wymaga zrozumienia struktury dokumentu i testowania na rzeczywistych danych. Narzędzie daje interaktywne środowisko do iterowania nad wyrażeniami bez konieczności konfigurowania projektu ani pisania kodu szablonowego.
Zastosowania testera XPath
Informacje o osiach XPath
Oś definiuje kierunek nawigacji względem bieżącego węzła (kontekstowego). Pełna składnia to oś::test-węzła[predykat], choć większość programistów korzysta na co dzień z form skróconych (//, @, ..). Poniższa tabela zawiera wszystkie osie wersji 1.0 z praktycznymi przykładami.
| Oś | Przykład | Opis |
|---|---|---|
| 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 |
Funkcje XPath 1.0
Język definiuje 27 wbudowanych funkcji w czterech kategoriach: zestawy węzłów, stringi, liczby i wartości logiczne. To są funkcje, których będziesz używać najczęściej przy pisaniu zapytań. Wszystkie są obsługiwane przez ten tester i przez każdą zgodną implementację.
| Funkcja | Kategoria | Opis |
|---|---|---|
| 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 |
Przykłady kodu
Te przykłady pokazują, jak programistycznie ewaluować wyrażenia. Każdy fragment kodu korzysta z tej samej struktury catalog.xml, dzięki czemu można porównać różnice w API między językami.
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