XPath Tester
Testa XPath-uttryck mot XML och se alla matchande noder
XML Inmatning
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.
Användningsfall för XPath Tester
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.
| Axel | Exempel | Beskrivning |
|---|---|---|
| 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 |
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.
| Funktion | Kategori | Beskrivning |
|---|---|---|
| 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 |
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.
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