XPath Tester

Testa XPath-uttryck mot XML och se alla matchande noder

Prova ett exempel

XML Inmatning

Körs lokalt · Säkert att klistra in hemligheter

Vad är XPath?

XPath (XML Path Language) är ett frågespråk för att välja noder från ett XML-dokument. Definierat av W3C som en del av XSLT-standarden behandlar XPath ett XML-dokument som ett nodträd och tillhandahåller en sökvägsbaserad syntax för att navigera i trädet. Ett XPath-uttryck som //book[@category="fiction"]/title väljer varje title-element inuti ett book-element vars category-attribut är lika med "fiction". XPath 1.0, den version som stöds av alla större webbläsare och de flesta XML-bibliotek, publicerades som en W3C Recommendation 1999 och är fortfarande den mest utbredda versionen.

XPath-uttryck returnerar en av fyra resultattyper: noduppsättningar, strängar, tal eller booleaner. En noduppsättning är det vanligaste resultatet och innehåller noll eller fler XML-noder (element, attribut, textnoder, kommentarer eller processinstruktioner). Sträng-, tal- och booleanresultat härstammar från XPath-funktioner som count(), sum(), contains() och booleanjämförelser. Detta typsystem gör XPath lämpligt både för att extrahera data och för att skriva villkorslogik i XSLT-formatmallar och XML Schema-påståenden.

Version 1.0-uttryck fungerar överallt: JavaScripts document.evaluate(), Pythons lxml och ElementTree, Javas javax.xml.xpath, PHPs DOMXPath och kommandoradsverktyg som xmllint. Version 2.0 och 3.1 lägger till rikare typsystem och funktioner men kräver dedikerade motorer som Saxon. Använd version 1.0 som standard. Välj 2.0 eller 3.1 bara när du behöver sekvenser, reguljära uttryck eller högre ordningens funktioner — och acceptera beroendet av Saxon eller BaseX.

Varför använda en online-XPath-testare?

Att skriva korrekta uttryck kräver förståelse för dokumentstrukturen och testning mot verkliga data. Verktyget ger dig en interaktiv miljö för att iterera på uttryck utan att sätta upp ett projekt eller skriva mallkod.

Testa uttryck direkt
Klistra in din XML, skriv ett uttryck och se matchande noder i realtid. Inget kompileringssteg, ingen REPL-installation, inga beroenden att installera.
🔒
Integritetsfokuserad behandling
All XML-parsning och frågeutvärdering körs i din webbläsare via de inbyggda API:erna DOMParser och document.evaluate(). Din XML-data lämnar aldrig din enhet.
🔍
Felsök komplexa frågor steg för steg
Bryt ner långa uttryck genom att testa varje axel och predikat individuellt. Se exakt vilka noder som matchar i varje steg för att isolera fel.
📋
Kopiera resultat för dokumentation
Kopiera matchade noder eller skalärvärden med ett klick. Användbart för att klistra in i felrapporter, testpåståenden eller datautvinningsskript.

Användningsfall för XPath Tester

Frontendutveckling
Testa XPath-väljare för SVG-manipulation eller XML-baserad konfiguration innan du bäddar in dem i JavaScript-kod som anropar document.evaluate().
Backendteknik
Validera frågor mot SOAP-svar eller XML API-nyttolaster innan du skriver extraktionslogik i Python, Java eller Go.
DevOps och infrastruktur
Fråga XML-konfigurationsfiler (Maven pom.xml, Spring beans, CI-pipelinekonfigurationer) för att extrahera beroendversioner eller verifiera inställningar utan att redigera filerna.
QA och testautomatisering
Bygg och verifiera XPath-locators för Selenium eller Playwright innan du lägger till dem i testskript. Testa gränsfall som saknade attribut eller namnrymdsprefixer.
Datateknik
Prototypa frågor för XML-dataflöden (RSS, Atom, XBRL-finansrapporter) innan du kopplar dem till ETL-pipelines.
Student och lärande
Experimentera med XPath-axlar, predikat och funktioner med exempel-XML. Se resultaten direkt för att bygga förståelse för trädtraverseringsmönster.

XPath-axelreferens

En axel definierar navigationsriktningen i förhållande till den aktuella (kontext)noden. Den fullständiga syntaxen är axel::nodtest[predikat], även om de flesta utvecklare dagligen använder de förkortade formerna (//, @, ..). Den här tabellen listar alla 1.0-axlar med praktiska exempel.

AxelExempelBeskrivning
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-funktioner

Språket definierar 27 inbyggda funktioner inom fyra kategorier: noduppsättning, sträng, tal och boolean. Det här är de funktioner du oftast använder när du skriver frågor. Alla stöds av den här testaren och av varje regelrätt implementation.

FunktionKategoriBeskrivning
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

Kodexempel

Dessa exempel visar hur man utvärderar uttryck programmatiskt. Varje kodexempel använder samma catalog.xml-struktur så att du kan jämföra API-skillnaderna mellan programspråken.

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

Vanliga frågor

Vad är skillnaden mellan XPath 1.0 och XPath 3.1?
Version 1.0 har fyra datatyper (noduppsättning, sträng, tal, boolean) och 27 funktioner. Version 3.1 lägger till sekvenser, kartor, arrayer, datum- och tidstyper, reguljära uttryck, högre ordningens funktioner och JSON-stöd. Webbläsare och de flesta standardbibliotek implementerar bara version 1.0. Version 3.1 kräver en dedikerad motor som Saxon.
Hur väljer jag noder med ett specifikt attributvärde?
Använd ett predikat med @-förkortningen för attributaxeln. Till exempel väljer //book[@category="fiction"] alla book-element där category-attributet är lika med "fiction". Du kan kombinera flera predikat: //book[@category="fiction"][@year > 2000].
Varför returnerar mitt XPath inga resultat trots att XML-dokumentet innehåller matchande element?
Den vanligaste orsaken är XML-namnrymder. Om din XML deklarerar en standardnamnrymd (xmlns="...") tillhör elementen den namnrymden även utan prefix. I version 1.0 måste du registrera namnrymden och använda ett prefix i ditt uttryck. I webbläsarens JavaScript skickar du en namnrymdsresolver som tredje argument till document.evaluate().
Kan XPath ändra XML-innehåll?
Nej. Det är ett skrivskyddat frågespråk. Det väljer och utvärderar noder men kan inte infoga, ta bort eller uppdatera dem. För att ändra XML använder du XSLT-transformeringar, DOM-manipulationsmetoder eller ett bibliotek som Pythons lxml som tillhandahåller separata API:er för redigering.
Vad betyder dubbla snedstreck (//) i XPath?
Det dubbla snedstrecket är en förkortning för axeln descendant-or-self. Uttrycket //title betyder "välj alla title-element varsomhelst i dokumentträdet, på vilket djup som helst." Det motsvarar den fullständiga formen /descendant-or-self::node()/title. Att använda // i början av ett uttryck söker igenom hela dokumentet; att använda det mitt i en sökväg (som /catalog//title) söker igenom ättlingar till en specifik nod.
Hur väljer jag textinnehåll i stället för elementnoden?
Lägg till /text() i slutet av ditt uttryck. Till exempel returnerar //book/title/text() textinnehållet i varje title-element som en strängnod, snarare än elementnoden i sig. I kod kan du också komma åt .textContent på den returnerade elementnoden utan att använda text().
Är XPath snabbare än CSS-väljare för att fråga XML?
CSS-väljare är optimerade för HTML och DOM-traversering i webbläsare. XPath är mer uttrycksfullt: det stöder föräldertraversering, syskonaxlar, numeriska predikat och inbyggda funktioner som CSS-väljare inte kan uttrycka. För HTML är CSS-väljare (querySelector) typiskt snabbare. För XML exponerar de flesta serversidans bibliotek bara XPath — CSS-väljare är inte ens ett alternativ.