FreeToGenerate.com

Roda no motor XPath do seu próprio navegador e diz o que ele vai recusar. Nada é enviado.

Expressão e documento

É analisado como XML. Serve qualquer coisa bem formada: cole um trecho do documento que você está consultando de verdade.

Resultados

Avaliando no seu navegador…

O que esta expressão usa

  • ends-with()funçãoadicionada depois do XPath 1.0: indisponível

O que escrever no lugar

Existe um equivalente exato em XPath 1.0. Uma string termina com um sufixo quando a substring que começa àquela distância do fim é igual a ele, lembrando que o XPath conta a partir de 1 — que é justamente onde uma versão feita à mão costuma errar por um.

Reescrito para XPath 1.0

substring(@href, string-length(@href) - string-length('.pdf') + 1) = '.pdf'

O que o seu navegador realmente faz

namespace::Verificando…

O eixo namespace faz parte do XPath 1.0 e mesmo assim é a peça em que os navegadores historicamente divergiram, então vale verificar em vez de supor. Isso roda no seu próprio navegador e conta o que encontra, e por isso a resposta acima pode não bater com a que outra pessoa vê.

Navegadores só falam XPath 1.0

A versão de XPath embutida nos navegadores é a de 1999. Ela define uma biblioteca básica de vinte e sete funções e treze eixos, e é só isso: tudo que o XPath 2.0 e posteriores acrescentaram existe apenas em ferramentas que você roda fora do navegador, como um processador XSLT 2.0 ou uma biblioteca que traz o próprio motor.

A lacuna tem um formato desconfortável em vez de arrumado. starts-with() existe. contains() existe. ends-with() não — ela chegou no XPath 2.0 — então a forma mais natural de selecionar links para PDF é exatamente a que não existe, e o erro que o navegador lança não explica o porquê. O mesmo vale para toda a família de expressões regulares, para trocar maiúsculas e minúsculas, e para mínimo e máximo.

As listas de funções e eixos vêm da recomendação XPath 1.0; as funções posteriores são conferidas contra XPath and XQuery Functions and Operators 3.1. Nada é enviado: a avaliação acontece nesta aba.

Também disponível em: English · Español · Français · العربية

Testador de XPath

Avalie uma expressão XPath no seu XML e veja quais funções os navegadores realmente suportam — e o que escrever no lugar.

O que é um testador de XPath

XPath é a linguagem para apontar partes de um documento XML: um caminho como //a[@class='external'] seleciona todos os links com aquela classe, onde quer que estejam na árvore. É o que bibliotecas de scraping, folhas XSLT, ferramentas de automação de navegador e vários formatos de configuração usam quando precisam dizer a qual elemento se referem.

Um testador de XPath deixa você escrever uma expressão, rodá-la contra um documento que você fornece e ver o que volta antes de levar isso para o código. Isso importa porque o XPath falha em silêncio nas duas direções: uma expressão que não seleciona nada se parece muito com uma expressão errada, e uma que dá erro fala de sintaxe quando o problema real é que a função usada não existe.

Este aqui roda a expressão no motor XPath do seu próprio navegador, que é o mesmo que os scripts da sua página usariam. Ele também lê a expressão e informa quais funções e eixos estão realmente disponíveis ali — a parte que a maioria dos testadores deixa você descobrir do jeito difícil.

Como usar

  1. Escreva sua expressão. De um caminho simples a um cheio de predicados. A análise abaixo se atualiza enquanto você digita, antes mesmo de rodar.
  2. Cole o XML onde buscar. Um trecho do documento real é o ideal. Ele é analisado como XML, então precisa estar bem formado: uma tag sem fechar é reportada como erro de análise em vez de ignorada em silêncio.
  3. Leia os dois painéis. Os resultados são o que o motor do seu navegador devolveu. Abaixo, cada função e cada eixo da sua expressão aparecem como disponíveis ou não, com a substituição em XPath 1.0 quando existe.

Navegadores só falam XPath 1.0

O XPath embutido em todo navegador é o de 1999, e nada posterior. Essa especificação define uma biblioteca básica de exatamente vinte e sete funções e exatamente treze eixos — essa é a linguagem inteira do ponto de vista de um navegador. O XPath 2.0 e o 3.1 acrescentaram muita coisa, e nada disso está disponível aqui; isso vive em processadores XSLT 2.0 e em bibliotecas que trazem o próprio motor.

A lacuna não tem o formato arrumado que você esperaria. starts-with() está entre as vinte e sete. contains() está entre as vinte e sete. ends-with() não — ela chegou no XPath 2.0 — o que significa que a maneira mais natural de selecionar links para arquivos PDF é justamente a forma que não roda, e o erro que o navegador lança fala da expressão e não da versão. Essa assimetria pega muita gente, e é a razão de esta página existir em vez de ser mais uma caixa que executa consultas.

E vale para tudo. Não há suporte nenhum a expressões regulares: matches(), replace() e tokenize() são acréscimos posteriores, e não dá para construí-los com o que sobra. Não há lower-case() nem upper-case(). Não há min(), max(), avg() nem abs(). Não são cantos obscuros — são as funções que as pessoas procuram primeiro.

Algumas têm substitutos honestos em XPath 1.0 e outras não, e saber quais são quais economiza uma tarde. ends-with() se reescreve exatamente, com substring() e string-length(), lembrando que o XPath conta caracteres a partir de um e não de zero. Trocar maiúsculas e minúsculas dá para aproximar com translate() se você soletrar os dois alfabetos, o que funciona para ASCII e mais nada. Expressões regulares não têm equivalente algum e precisam sair da consulta para o código em volta.

Limitações honestas

Seu documento é analisado como XML, não como HTML. É o mais rígido dos dois, e é proposital: o XPath é definido sobre uma árvore XML, e analisar de forma frouxa deixaria você escrever aqui expressões que se comportam de outro jeito contra um documento real. A consequência prática é que um trecho de HTML do mundo real com uma tag sem fechar será recusado, e você vai precisar arrumar antes.

Namespaces são a aresta mais afiada do XPath e esta página não a suaviza. Se o seu documento declara um namespace padrão, um simples //title não seleciona nada, porque no XPath 1.0 um nome sem prefixo significa sem namespace, e não o namespace padrão. Não há como contornar isso dentro da própria linguagem: você precisa de um resolvedor de namespaces, que é uma função e portanto não cabe numa caixa de texto, ou do contorno com local-name().

A verificação que esta página faz na sua expressão lê em vez de executar, então ela identifica funções e eixos pelo nome. Uma expressão pode passar nessa verificação e ainda estar errada por motivos que análise nenhuma pega: um argumento do tipo errado, ou um predicado que significa outra coisa. O painel de resultados é a resposta; a análise está ali para explicar uma falha que o navegador descreve mal.

Uma coisa é deliberadamente reportada em vez de suposta: o eixo namespace faz parte do XPath 1.0 e mesmo assim foi a peça em que os navegadores divergiram. Em vez de dizer o que o seu faz, a página roda a verificação no seu navegador e conta o que encontra — por isso aquela linha pode não bater com a que outra pessoa vê.

Por que é grátis?

O motor é o que o seu navegador já tem, então não há nada para rodar nem nada para cobrar. Avaliar uma expressão XPath não custa mais do que qualquer outro pedaço de script da página.

Nada do que você cola é enviado, guardado ou registrado. O XML que você está depurando costuma ser um trecho de dados reais de alguém, e o jeito confiável de manter isso privado é nunca recebê-lo.