XPath - XPath

XPath
Paradigma Linguagem de consulta
Desenvolvedor W3C
Apareceu pela primeira vez 1998
Versão estável
3.1 / 21 de março de 2017 ; 4 anos atras ( 21-03-2017 )
Influenciado por
XSLT , XPointer
Influenciado
Esquema XML , XForms

XPath ( XML Path Language ) é uma linguagem de consulta para selecionar nós de um documento XML . Além disso, XPath pode ser usado para calcular valores (por exemplo, strings , números ou valores booleanos ) a partir do conteúdo de um documento XML. XPath foi definido pelo World Wide Web Consortium (W3C).

Visão geral

A linguagem XPath é baseada em uma representação em árvore do documento XML e fornece a capacidade de navegar pela árvore, selecionando nós por uma variedade de critérios. No uso popular (embora não na especificação oficial), uma expressão XPath é freqüentemente referida simplesmente como "um XPath".

Motivados originalmente pelo desejo de fornecer uma sintaxe comum e um modelo de comportamento entre o XPointer e o XSLT , os subconjuntos da linguagem de consulta XPath são usados ​​em outras especificações W3C , como XML Schema , XForms e Internationalalization Tag Set (ITS) .

XPath foi adotado por várias bibliotecas e ferramentas de processamento XML, muitas das quais também oferecem seletores CSS , outro padrão W3C, como uma alternativa mais simples para XPath.

Versões

Existem várias versões do XPath em uso. XPath 1.0 foi publicado em 1999, XPath 2.0 em 2007 (com uma segunda edição em 2010), XPath 3.0 em 2014 e XPath 3.1 em 2017. No entanto, XPath 1.0 ainda é a versão mais amplamente disponível.

  • XPath 1.0 se tornou uma recomendação em 16 de novembro de 1999 e é amplamente implementado e usado, seja por conta própria (chamado por meio de uma API de linguagens como Java , C # , Python ou JavaScript ) ou incorporado em linguagens como XSLT , XProc , XML Schema ou XForms.
  • XPath 2.0 tornou-se uma recomendação em 23 de janeiro de 2007, com uma segunda edição publicada em 14 de dezembro de 2010. Existem várias implementações, mas não são tão amplamente utilizadas como XPath 1.0. A especificação da linguagem XPath 2.0 é muito maior do que XPath 1.0 e altera alguns dos conceitos fundamentais da linguagem, como o sistema de tipos.
    A mudança mais notável é que o XPath 2.0 é construído em torno do XQuery e XPath Data Model (XDM), que possui um sistema de tipo muito mais rico. Cada valor é agora uma sequência (um único valor atômico ou nó é considerado uma sequência de comprimento um). Os conjuntos de nós do XPath 1.0 são substituídos por sequências de nós, que podem estar em qualquer ordem.
    Para oferecer suporte a conjuntos de tipos mais ricos, o XPath 2.0 oferece um conjunto bastante expandido de funções e operadores.
    XPath 2.0 é na verdade um subconjunto de XQuery 1.0. Eles compartilham o mesmo modelo de dados ( XDM ). Ele oferece uma forexpressão que é uma versão reduzida das expressões " FLWOR " em XQuery. É possível descrever a linguagem listando as partes de XQuery que ela omite: os principais exemplos são o prólogo da consulta, construtores de elemento e atributo, o restante da sintaxe "FLWOR" e a typeswitchexpressão.
  • XPath 3.0 tornou-se uma recomendação em 8 de abril de 2014. O novo recurso mais significativo é o suporte para funções como valores de primeira classe. XPath 3.0 é um subconjunto do XQuery 3.0, e a maioria das implementações atuais (abril de 2014) existe como parte de um mecanismo XQuery 3.0.
  • XPath 3.1 se tornou uma recomendação em 21 de março de 2017. Esta versão adiciona novos tipos de dados: mapas e matrizes, principalmente para sustentar o suporte para JSON .
Expressão XPath aplicada a um arquivo XML

Sintaxe e semântica (XPath 1.0)

O tipo de expressão mais importante no XPath é um caminho de localização . Um caminho de localização consiste em uma sequência de etapas de localização . Cada etapa de localização possui três componentes:

Uma expressão XPath é avaliada em relação a um nó de contexto . Um especificador de eixo, como 'filho' ou 'descendente', especifica a direção para navegar a partir do nó de contexto. O teste de nó e o predicado são usados ​​para filtrar os nós especificados pelo especificador de eixo: Por exemplo, o teste de nó 'A' requer que todos os nós navegados tenham rótulo 'A'. Um predicado pode ser usado para especificar que os nós selecionados têm certas propriedades, que são especificadas pelas próprias expressões XPath.

A sintaxe XPath vem em dois sabores: a sintaxe abreviada , é mais compacta e permite que XPaths sejam escritos e lidos facilmente usando caracteres e construções intuitivas e, em muitos casos, familiares. A sintaxe completa é mais detalhada, mas permite que mais opções sejam especificadas e é mais descritiva se lida com atenção.

Sintaxe abreviada

A notação compacta permite muitos padrões e abreviações para casos comuns. Dado XML de origem contendo pelo menos

<A>
  <B>
    <C/>
  </B>
</A>

o XPath mais simples assume uma forma como

  • /A/B/C

que seleciona elementos C que são filhos de elementos B que são filhos do elemento A que forma o elemento mais externo do documento XML. A sintaxe XPath foi projetada para imitar o URI ( Uniform Resource Identifier ) e a sintaxe de caminho de arquivo no estilo Unix .

Expressões mais complexas podem ser construídas especificando um eixo diferente do eixo "filho" padrão, um teste de nó diferente de um nome simples ou predicados, que podem ser escritos entre colchetes após qualquer etapa. Por exemplo, a expressão

  • A//B/*[1]

seleciona o primeiro filho (' *[1]'), qualquer que seja o nome, de cada elemento B que seja um filho ou outro descendente mais profundo (' //') de um elemento A que seja filho do nó de contexto atual (a expressão não começa com um ' /'). Observe que o predicado é [1]mais vinculado do que o /operador. Para selecionar o primeiro nó selecionado pela expressão A//B/*, escreva (A//B/*)[1]. Observe também que os valores de índice em predicados XPath (tecnicamente, 'posições de proximidade' de conjuntos de nós XPath) começam em 1, não em 0, como é comum em linguagens como C e Java.

Sintaxe expandida

Na sintaxe completa e não abreviada, os dois exemplos acima seriam escritos

  • /child::A/child::B/child::C
  • child::A/descendant-or-self::node()/child::B/child::node()[position()=1]

Aqui, em cada etapa do XPath, o eixo (por exemplo, childou descendant-or-self) é especificado explicitamente, seguido por ::e, em seguida, o teste do , como Aou node()nos exemplos acima.

Aqui o mesmo, mas mais curto:

A//B/*[position()=1]

Especificadores de eixo

Os especificadores de eixo indicam a direção da navegação na representação em árvore do documento XML. Os eixos disponíveis são:

Especificadores de eixo em XPath
Sintaxe Completa Sintaxe abreviada Notas
ancestor
ancestor-or-self
attribute @ @abc é curto para attribute::abc
child xyz é curto para child::xyz
descendant
descendant-or-self // // é curto para /descendant-or-self::node()/
following
following-sibling
namespace
parent .. .. é curto para parent::node()
preceding
preceding-sibling
self . . é curto para self::node()

Como um exemplo de uso do eixo de atributo na sintaxe abreviada, //a/@hrefseleciona o atributo chamado hrefem aelementos em qualquer lugar na árvore do documento. A expressão . (uma abreviatura para self :: node () ) é mais comumente usada dentro de um predicado para se referir ao nó atualmente selecionado. Por exemplo, h3[.='See also']seleciona um elemento chamado h3no contexto atual, cujo conteúdo de texto é See also.

Testes de nó

Os testes de nó podem consistir em nomes de nós específicos ou expressões mais gerais. No caso de um documento XML no qual o prefixo de namespace gsfoi definido, //gs:enquiryencontrará todos os enquiryelementos nesse namespace e //gs:*encontrará todos os elementos, independentemente do nome local, nesse namespace.

Outros formatos de teste de nó são:

Comente()
encontra um nó de comentário XML, por exemplo <!-- Comment -->
texto()
encontra um nó do tipo texto, por exemplo, o hello worldem<k>hello<m> world</m></k>
instrução de processamento ()
encontra instruções de processamento de XML , como <?php echo $a; ?>. Nesse caso, processing-instruction('php')seria compatível.
nó()
encontra qualquer nó.

Predicados

Predicados, escritos como expressões entre colchetes, podem ser usados ​​para filtrar um conjunto de nós de acordo com alguma condição. Por exemplo, aretorna um conjunto de nós (todos os aelementos que são filhos do nó de contexto) e a[@href='help.php']mantém apenas aqueles elementos que possuem um hrefatributo com o valor help.php.

Não há limite para o número de predicados em uma etapa e eles não precisam ser confinados à última etapa em um XPath. Eles também podem ser aninhados em qualquer profundidade. Os caminhos especificados nos predicados começam no contexto da etapa atual (ou seja, no teste do nó imediatamente anterior) e não alteram esse contexto. Todos os predicados devem ser satisfeitos para que uma correspondência ocorra.

Quando o valor do predicado é numérico, ele é sintático-açucarado para comparação com a posição do nó no conjunto de nós (conforme fornecido pela função position()). Então p[1]é uma abreviação para p[position()=1]e seleciona o primeiro pelemento filho, enquanto p[last()]é uma abreviação para p[position()=last()]e seleciona o último pfilho do nó de contexto.

Em outros casos, o valor do predicado é automaticamente convertido em um booleano. Quando o predicado é avaliado como um conjunto de nós, o resultado é verdadeiro quando o conjunto de nós não está vazio . Assim, p[@x]seleciona os pelementos que possuem um atributo denominado x.

Um exemplo mais complexo: a expressão a[/html/@lang='en'][@href='help.php'][1]/@targetseleciona o valor do targetatributo do primeiro aelemento entre os filhos do nó de contexto que tem seu hrefatributo definido como help.php, desde que o htmlelemento de nível superior do documento também tenha um langatributo definido como en. A referência a um atributo do elemento de nível superior no primeiro predicado não afeta o contexto de outros predicados nem o da própria etapa de localização.

A ordem dos predicados é significativa se os predicados testam a posição de um nó. Cada predicado recebe um conjunto de nós e retorna um conjunto de nós (potencialmente) menor. Portanto a[1][@href='help.php'], encontrará uma correspondência apenas se o primeiro afilho do nó de contexto satisfizer a condição @href='help.php', enquanto a[@href='help.php'][1]encontrará o primeiro afilho que satisfaça essa condição.

Funções e operadores

XPath 1.0 define quatro tipos de dados: conjuntos de nós (conjuntos de nós sem ordem intrínseca), strings, números e booleanos.

Os operadores disponíveis são:

  • Os operadores "/", "//" e "[...]", usados ​​em expressões de caminho, conforme descrito acima.
  • Um operador de união, "|", que forma a união de dois conjuntos de nós.
  • Operadores booleanos "e" e "ou" e uma função "not ()"
  • Operadores aritméticos "+", "-", "*", "div" (dividir) e "mod"
  • Operadores de comparação "=", "! =", "<", ">", "<=", "> ="

A biblioteca de funções inclui:

  • Funções para manipular strings: concat (), substring (), contains (), substring-before (), substring-after (), translate (), normalize-space (), string-length ()
  • Funções para manipular números: soma (), redondo (), piso (), teto ()
  • Funções para obter propriedades de nós: name (), local-name (), namespace-uri ()
  • Funções para obter informações sobre o contexto de processamento: position (), last ()
  • Funções de conversão de tipo: string (), número (), boolean ()

Algumas das funções mais comumente úteis são detalhadas a seguir.

Funções de conjunto de nós

posição()
retorna um número que representa a posição deste nó na sequência de nós atualmente em processamento (por exemplo, os nós selecionados por uma instrução xsl: for-each em XSLT).
contagem ( conjunto de nós )
retorna o número de nós no conjunto de nós fornecido como seu argumento.

Funções de string

string ( objeto ?)
converte qualquer um dos quatro tipos de dados XPath em uma string de acordo com as regras integradas. Se o valor do argumento for um conjunto de nós, a função retornará o valor da string do primeiro nó na ordem do documento, ignorando quaisquer outros nós.
concat ( string , string , string *)
concatena duas ou mais strings
começa com ( s1 , s2 )
retorna truese s1começa coms2
contém ( s1 , s2 )
retorna truese s1contéms2
substring ( string , início , comprimento ?)
exemplo: substring("ABCDEF",2,3)retorna "BCD".
substring-before ( s1 , s2 )
exemplo: substring-before("1999/04/01","/")retorna1999
substring-after ( s1 , s2 )
exemplo: substring-after("1999/04/01","/")retorna04/01
comprimento da string (string?)
retorna o número de caracteres na string
normalizar espaço ( string ?)
todos os espaços em branco à esquerda e à direita são removidos e todas as sequências de caracteres de espaço em branco são substituídas por um único espaço. Isso é muito útil quando o XML original pode ter sido formatado em formato padrão , o que pode tornar o processamento posterior da string não confiável.

Funções booleanas

não ( booleano )
nega qualquer expressão booleana.
verdade()
avalia como verdadeiro .
falso()
avalia como falso .

Funções numéricas

soma ( conjunto de nós )
converte os valores de sequência de todos os nós encontrados pelo argumento XPath em números, de acordo com as regras de conversão integradas e, em seguida, retorna a soma desses números.

Exemplos de uso

As expressões podem ser criadas dentro de predicados usando os operadores: =, !=, <=, <, >=e >. Expressões booleanas podem ser combinadas com colchetes ()e operadores booleanos ande ortambém com a not()função descrita acima. Os cálculos numéricos podem usar *, +, -, dive mod. Strings podem consistir em quaisquer caracteres Unicode .

//item[@price > 2*@discount] seleciona itens cujo atributo de preço é maior que duas vezes o valor numérico de seu atributo de desconto.

Conjuntos de nós inteiros podem ser combinados ( 'unidos' ) usando o caractere de barra vertical |. Os conjuntos de nós que atendem a uma ou mais das várias condições podem ser encontrados combinando as condições dentro de um predicado com ' or'.

v[x or y] | w[z]retornará um único conjunto de nós que consiste em todos os velementos que possuem xou yelementos-filho, bem como todos os welementos que possuem zelementos-filho, que foram encontrados no contexto atual.

Sintaxe e semântica (XPath 2.0)

Sintaxe e semântica (XPath 3)

Exemplos

Dado um documento XML de amostra

<?xml version="1.0" encoding="utf-8"?>
<Wikimedia>
  <projects>
    <project name="Wikipedia" launch="2001-01-05">
      <editions>
        <edition language="English">en.wikipedia.org</edition>
        <edition language="German">de.wikipedia.org</edition>
        <edition language="French">fr.wikipedia.org</edition>
        <edition language="Polish">pl.wikipedia.org</edition>
        <edition language="Spanish">es.wikipedia.org</edition>
      </editions>
    </project>
    <project name="Wiktionary" launch="2002-12-12">
      <editions>
        <edition language="English">en.wiktionary.org</edition>
        <edition language="French">fr.wiktionary.org</edition>
        <edition language="Vietnamese">vi.wiktionary.org</edition>
        <edition language="Turkish">tr.wiktionary.org</edition>
        <edition language="Spanish">es.wiktionary.org</edition>
      </editions>
    </project>
  </projects>
</Wikimedia>

A expressão XPath

/Wikimedia/projects/project/@name

seleciona atributos de nome para todos os projetos, e

/Wikimedia//editions

seleciona todas as edições de todos os projetos, e

/Wikimedia/projects/project/editions/edition[@language='English']/text()

seleciona endereços de todos os projetos da Wikimedia em inglês (texto de todos os elementos de edição em que o atributo de idioma é igual ao inglês ). E o seguinte

/Wikimedia/projects/project[@name='Wikipedia']/editions/edition/text()

seleciona endereços de todas as Wikipédias (texto de todos os elementos de edição existentes no elemento projeto com um atributo de nome da Wikipédia ).

Implementações

Ferramentas de linha de comando

  • XMLStarlet ferramenta fácil de usar para testar / executar comandos XPath em tempo real.
  • xmllint (libxml2)
  • RaptorXML Server da Altova oferece suporte a XPath 1.0, 2.0 e 3.0
  • Xidel

C / C ++

Pascal grátis

  • A unidade XPath está incluída nas bibliotecas padrão

Implementações para motores de banco de dados

Java

O pacote Javajavax.xml.xpath faz parte da edição padrão Java desde Java 5 por meio da API Java para processamento XML . Tecnicamente, esta é uma API XPath em vez de uma implementação XPath e permite ao programador a capacidade de selecionar uma implementação específica que esteja em conformidade com a interface.

JavaScript

.NET Framework

  • Nos namespaces System.Xml e System.Xml.XPath
  • Sedna XML Database

Perl

PHP

  • Sedna XML Database
  • DOMXPath via extensão libxml

Pitão

Rubi

Esquema

  • Sedna XML Database

SQL

  • MySQL suporta um subconjunto de XPath da versão 5.1.5 em diante
  • PostgreSQL suporta XPath e XSLT a partir da versão 8.4

Tcl

  • O pacote tDOM fornece uma implementação XPath completa, compatível e rápida em C

Use em linguagens de esquema

XPath é cada vez mais usado para expressar restrições em linguagens de esquema para XML.

  • A linguagem de esquema Schematron (agora padrão ISO ) foi a pioneira nessa abordagem.
  • Um subconjunto de streaming de XPath é usado no W3C XML Schema 1.0 para expressar exclusividade e restrições de chave. No XSD 1.1, o uso de XPath é estendido para oferecer suporte à atribuição de tipo condicional com base em valores de atributos e para permitir que asserções booleanas arbitrárias sejam avaliadas em relação ao conteúdo dos elementos.
  • XForms usa XPath para vincular tipos a valores.
  • A abordagem encontrou uso até mesmo em aplicativos não XML, como o analisador de código-fonte para Java chamado PMD : o Java é convertido em uma árvore de análise semelhante a DOM e as regras XPath são definidas na árvore.

Veja também

Notas

Referências

links externos