Testador XPath
Teste expressões XPath contra XML e veja todos os nós correspondentes
Entrada XML
O que é XPath?
XPath (XML Path Language) é uma linguagem de consulta para selecionar nós de um documento XML. Definido pelo W3C como parte do padrão XSLT, o XPath trata um documento XML como uma árvore de nós e fornece uma sintaxe baseada em caminhos para navegar por essa árvore. Uma expressão XPath como //book[@category="fiction"]/title seleciona todos os elementos title dentro de um elemento book cujo atributo category é igual a "fiction". O XPath 1.0, versão suportada por todos os principais navegadores e pela maioria das bibliotecas XML, foi publicado como Recomendação W3C em 1999 e continua sendo a versão mais amplamente utilizada.
Expressões XPath retornam um de quatro tipos de resultado: conjuntos de nós, strings, números ou booleanos. Um conjunto de nós é o resultado mais comum e contém zero ou mais nós XML (elementos, atributos, nós de texto, comentários ou instruções de processamento). Resultados do tipo string, número e booleano provêm de funções XPath como count(), sum(), contains() e comparações booleanas. Esse sistema de tipos torna o XPath adequado tanto para extração de dados quanto para escrever lógica condicional em folhas de estilo XSLT e asserções de XML Schema.
Expressões da versão 1.0 funcionam em todo lugar: document.evaluate() do JavaScript, lxml e ElementTree do Python, javax.xml.xpath do Java, DOMXPath do PHP e ferramentas de linha de comando como xmllint. As versões 2.0 e 3.1 adicionam sistemas de tipos mais ricos e novas funções, mas exigem motores dedicados como o Saxon. Use a versão 1.0 como padrão. Recorra à 2.0 ou 3.1 apenas quando precisar de sequências, expressões regulares ou funções de ordem superior — e aceite a dependência do Saxon ou BaseX.
Por que Usar um Testador XPath Online?
Escrever expressões corretas exige compreender a estrutura do documento e testá-las contra dados reais. A ferramenta oferece um ambiente interativo para iterar sobre as expressões sem precisar configurar um projeto ou escrever código repetitivo.
Casos de Uso do Testador XPath
Referência de Eixos XPath
Um eixo define a direção de navegação em relação ao nó atual (de contexto). A sintaxe completa é axis::node-test[predicate], embora a maioria dos desenvolvedores use as formas abreviadas (//, @, ..) no dia a dia. Esta tabela lista todos os eixos da versão 1.0 com exemplos práticos.
| Eixo | Exemplo | Descrição |
|---|---|---|
| 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 |
Funções XPath 1.0
A linguagem define 27 funções nativas em quatro categorias: conjunto de nós, string, número e booleano. Estas são as funções que você usará com mais frequência ao escrever consultas. Todas são suportadas por este testador e por qualquer implementação em conformidade com o padrão.
| Função | Categoria | Descrição |
|---|---|---|
| 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 |
Exemplos de Código
Estes exemplos mostram como avaliar expressões programaticamente. Cada trecho usa a mesma estrutura catalog.xml para que você possa comparar as diferenças de API entre as linguagens.
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