Tester XPath

Testuj wyrażenia XPath dla XML i zobacz wszystkie pasujące węzły

Wypróbuj przykład

Wejście XML

Działa lokalnie · Bezpieczne do wklejania sekretów

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.

Natychmiastowe testowanie wyrażeń
Wklej XML, wpisz wyrażenie i obserwuj pasujące węzły w czasie rzeczywistym. Bez etapu kompilacji, bez konfigurowania środowiska REPL, bez instalowania zależności.
🔒
Przetwarzanie z priorytetem prywatności
Całe parsowanie XML i ewaluacja zapytań odbywa się w przeglądarce przy użyciu natywnych API DOMParser i document.evaluate(). Twoje dane XML nigdy nie opuszczają urządzenia.
🔍
Debugowanie złożonych zapytań krok po kroku
Rozkładaj długie wyrażenia na części, testując każdą oś i predykat osobno. Zobacz dokładnie, które węzły pasują na każdym kroku, aby zlokalizować błędy.
📋
Kopiowanie wyników do dokumentacji
Skopiuj pasujące węzły lub wyniki skalarne jednym kliknięciem. Przydatne do wklejania do raportów o błędach, asercji testowych lub skryptów ekstrakcji danych.

Zastosowania testera XPath

Programista frontendowy
Testuj selektory XPath do manipulacji SVG lub konfiguracji opartej na XML przed osadzeniem ich w kodzie JavaScript wywołującym document.evaluate().
Inżynier backendowy
Weryfikuj zapytania dla odpowiedzi SOAP lub ładunków XML API przed pisaniem logiki ekstrakcji w Pythonie, Javie lub Go.
DevOps / Infrastruktura
Zapytuj pliki konfiguracyjne XML (Maven pom.xml, Spring beans, konfiguracje potoków CI), aby wyodrębnić wersje zależności lub zweryfikować ustawienia bez edytowania plików.
QA / Automatyzacja testów
Buduj i weryfikuj lokatory XPath dla Selenium lub Playwright przed dodaniem ich do skryptów testowych. Testuj przypadki brzegowe, takie jak brakujące atrybuty lub prefiksy przestrzeni nazw.
Inżynier danych
Prototypuj zapytania dla kanałów danych XML (RSS, Atom, raporty finansowe XBRL) przed podłączeniem ich do potoków ETL.
Student / uczący się
Eksperymentuj z osiami, predykatami i funkcjami XPath na przykładowym XML. Wyniki pojawiają się natychmiast, co pozwala budować intuicję dotyczącą wzorców przechodzenia drzewa.

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.

PrzykładOpis
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

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ę.

FunkcjaKategoriaOpis
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

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.

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

Często zadawane pytania

Jaka jest różnica między XPath 1.0 a XPath 3.1?
Wersja 1.0 ma cztery typy danych (zestaw węzłów, string, liczba, wartość logiczna) i 27 funkcji. Wersja 3.1 dodaje sekwencje, mapy, tablice, typy daty i czasu, wyrażenia regularne, funkcje wyższego rzędu oraz obsługę JSON. Przeglądarki i większość standardowych bibliotek implementują wyłącznie wersję 1.0. Wersja 3.1 wymaga dedykowanego silnika, takiego jak Saxon.
Jak wybrać węzły o określonej wartości atrybutu?
Użyj predykatu ze skrótem @ dla osi atrybutów. Na przykład //book[@category="fiction"] wybiera wszystkie elementy book, których atrybut category ma wartość "fiction". Możesz łączyć wiele predykatów: //book[@category="fiction"][@year > 2000].
Dlaczego moje wyrażenie XPath nie zwraca wyników, choć XML zawiera pasujące elementy?
Najczęstszą przyczyną są przestrzenie nazw XML. Jeśli Twój XML deklaruje domyślną przestrzeń nazw (xmlns="..."), elementy należą do tej przestrzeni nawet bez prefiksu. W wersji 1.0 musisz zarejestrować przestrzeń nazw i użyć prefiksu w wyrażeniu. W JavaScript przeglądarki przekaż resolver przestrzeni nazw jako trzeci argument do document.evaluate().
Czy XPath może modyfikować zawartość XML?
Nie. To tylko do odczytu język zapytań. Wybiera i ewaluuje węzły, ale nie może ich wstawiać, usuwać ani aktualizować. Aby modyfikować XML, użyj transformacji XSLT, metod manipulacji DOM lub biblioteki takiej jak lxml w Pythonie, która udostępnia osobne API do edycji.
Co oznacza podwójny ukośnik (//) w XPath?
Podwójny ukośnik to skrót dla osi descendant-or-self. Wyrażenie //title oznacza "wybierz wszystkie elementy title gdziekolwiek w drzewie dokumentu, na dowolnym poziomie głębokości". Jest równoważne pełnej formie /descendant-or-self::node()/title. Użycie // na początku wyrażenia przeszukuje cały dokument; użycie w środku ścieżki (np. /catalog//title) przeszukuje potomków określonego węzła.
Jak wybrać zawartość tekstową zamiast węzła elementu?
Dołącz /text() do swojego wyrażenia. Na przykład //book/title/text() zwraca zawartość tekstową każdego elementu title jako węzeł tekstowy, a nie sam węzeł elementu. W kodzie można też uzyskać dostęp do .textContent na zwróconym węźle elementu bez użycia text().
Czy XPath jest szybszy niż selektory CSS do zapytań o XML?
Selektory CSS są zoptymalizowane pod kątem HTML i przechodzenia DOM w przeglądarkach. XPath jest bardziej ekspresyjny: obsługuje przechodzenie do elementów nadrzędnych, osie rodzeństwa, predykaty liczbowe i wbudowane funkcje, których selektory CSS nie potrafią wyrazić. Dla HTML selektory CSS (querySelector) są zazwyczaj szybsze. Dla XML większość bibliotek po stronie serwera udostępnia wyłącznie XPath — selektory CSS nie są tam w ogóle opcją.