ToolDeck

Testador XPath

Teste expressões XPath contra XML e veja todos os nós correspondentes

Experimente um exemplo

Entrada XML

Roda localmente · Seguro para colar segredos

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.

Teste expressões instantaneamente
Cole seu XML, digite uma expressão e veja os nós correspondentes em tempo real. Sem etapa de compilação, sem configuração de REPL, sem dependências para instalar.
🔒
Processamento com privacidade em primeiro lugar
Todo o processamento de XML e a avaliação de consultas é feita no seu navegador usando as APIs nativas DOMParser e document.evaluate(). Seus dados XML nunca saem da sua máquina.
🔍
Depure consultas complexas passo a passo
Desmonte expressões longas testando cada eixo e predicado individualmente. Veja exatamente quais nós correspondem em cada etapa para isolar os erros.
📋
Copie os resultados para documentação
Copie nós correspondentes ou resultados escalares com um clique. Útil para colar em relatórios de bugs, asserções de testes ou scripts de extração de dados.

Casos de Uso do Testador XPath

Desenvolvedor frontend
Teste seletores XPath para manipulação de SVG ou configuração baseada em XML antes de incorporá-los em código JavaScript que chama document.evaluate().
Engenheiro backend
Valide consultas contra respostas SOAP ou payloads de APIs XML antes de escrever a lógica de extração em Python, Java ou Go.
DevOps / Infraestrutura
Consulte arquivos de configuração XML (Maven pom.xml, Spring beans, configurações de pipeline de CI) para extrair versões de dependências ou verificar configurações sem editar os arquivos.
QA / Automação de testes
Construa e verifique localizadores XPath para Selenium ou Playwright antes de adicioná-los aos scripts de teste. Teste casos extremos como atributos ausentes ou prefixos de namespace.
Engenheiro de dados
Prototipe consultas para feeds de dados XML (RSS, Atom, relatórios financeiros XBRL) antes de conectá-los a pipelines de ETL.
Estudante / aprendiz
Experimente eixos, predicados e funções XPath usando XML de exemplo. Veja os resultados imediatamente para desenvolver a intuição sobre padrões de navegação em árvores.

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.

EixoExemploDescrição
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

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çãoCategoriaDescrição
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

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.

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

Perguntas Frequentes

Qual é a diferença entre XPath 1.0 e XPath 3.1?
A versão 1.0 possui quatro tipos de dados (conjunto de nós, string, número, booleano) e 27 funções. A versão 3.1 adiciona sequências, mapas, arrays, tipos de data/hora, expressões regulares, funções de ordem superior e suporte a JSON. Navegadores e a maioria das bibliotecas padrão implementam apenas a versão 1.0. A versão 3.1 requer um motor dedicado como o Saxon.
Como seleciono nós com um valor de atributo específico?
Use um predicado com a abreviação @ para o eixo de atributo. Por exemplo, //book[@category="fiction"] seleciona todos os elementos book onde o atributo category é igual a "fiction". Você pode combinar múltiplos predicados: //book[@category="fiction"][@year > 2000].
Por que meu XPath não retorna resultados mesmo que o XML contenha elementos correspondentes?
A causa mais comum são os namespaces XML. Se o seu XML declara um namespace padrão (xmlns="..."), os elementos pertencem a esse namespace mesmo sem um prefixo. Na versão 1.0, você deve registrar o namespace e usar um prefixo na sua expressão. Em JavaScript no navegador, passe um resolvedor de namespace como terceiro argumento para document.evaluate().
XPath pode modificar o conteúdo XML?
Não. É uma linguagem de consulta somente leitura. Ela seleciona e avalia nós, mas não pode inserir, excluir ou atualizá-los. Para modificar XML, use transformações XSLT, métodos de manipulação do DOM ou uma biblioteca como lxml do Python, que oferece APIs separadas para edição.
O que significa a barra dupla (//) no XPath?
A barra dupla é uma abreviação para o eixo descendant-or-self. A expressão //title significa "selecionar todos os elementos title em qualquer lugar da árvore do documento, em qualquer profundidade." É equivalente à forma completa /descendant-or-self::node()/title. Usar // no início de uma expressão pesquisa o documento inteiro; usá-la no meio do caminho (como /catalog//title) pesquisa os descendentes de um nó específico.
Como seleciono o conteúdo de texto em vez do nó elemento?
Acrescente /text() à sua expressão. Por exemplo, //book/title/text() retorna o conteúdo de texto de cada elemento title como um nó de string, em vez do nó elemento em si. No código, você também pode acessar .textContent no nó elemento retornado sem usar text().
XPath é mais rápido que seletores CSS para consultar XML?
Seletores CSS são otimizados para HTML e navegação no DOM em navegadores. O XPath é mais expressivo: suporta navegação pelo elemento pai, eixos de irmãos, predicados numéricos e funções nativas que seletores CSS não conseguem expressar. Para HTML, seletores CSS (querySelector) são tipicamente mais rápidos. Para XML, a maioria das bibliotecas do lado do servidor expõe apenas XPath — seletores CSS simplesmente não são uma opção.