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
|
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
for
expressã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 atypeswitch
expressã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 .
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:
- um eixo
- um teste de nó
- zero ou mais predicados .
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, child
ou descendant-or-self
) é especificado explicitamente, seguido por ::
e, em seguida, o teste do nó , como A
ou 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:
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/@href
seleciona o atributo chamado href
em a
elementos 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 h3
no 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 gs
foi definido, //gs:enquiry
encontrará todos os enquiry
elementos 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 world
em<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, a
retorna um conjunto de nós (todos os a
elementos que são filhos do nó de contexto) e a[@href='help.php']
mantém apenas aqueles elementos que possuem um href
atributo 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 p
elemento filho, enquanto p[last()]
é uma abreviação para p[position()=last()]
e seleciona o último p
filho 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 p
elementos que possuem um atributo denominado x
.
Um exemplo mais complexo: a expressão a[/html/@lang='en'][@href='help.php'][1]/@target
seleciona o valor do target
atributo do primeiro a
elemento entre os filhos do nó de contexto que tem seu href
atributo definido como help.php
, desde que o html
elemento de nível superior do documento também tenha um lang
atributo 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 a
filho do nó de contexto satisfizer a condição @href='help.php'
, enquanto a[@href='help.php'][1]
encontrará o primeiro a
filho 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
true
ses1
começa coms2
- contém ( s1 , s2 )
- retorna
true
ses1
conté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 and
e or
também com a not()
função descrita acima. Os cálculos numéricos podem usar *, +, -, div
e 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 v
elementos que possuem x
ou y
elementos-filho, bem como todos os w
elementos que possuem z
elementos-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
- Saxon XSLT suporta XPath 1.0, XPath 2.0 e XPath 3.0 (bem como XSLT 2.0, XQuery 3.0 e XPath 3.0)
- BaseX (também suporta XPath 2.0 e XQuery)
- VTD-XML
- Sedna XML Database XML: DB e proprietário.
- QuiXPath, uma implementação de streaming de código aberto da Innovimax
- Xalan
- Dom4j
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
- Plug-in jQuery XPath baseado na implementação Open-source XPath 2.0 em JavaScript
- FontoXPath Implementação XPath 3.1 de código aberto em JavaScript. Atualmente em desenvolvimento.
.NET Framework
- Nos namespaces System.Xml e System.Xml.XPath
- Sedna XML Database
Perl
- XML :: LibXML (libxml2)
PHP
- Sedna XML Database
- DOMXPath via extensão libxml
Pitão
- A API ElementTree XML na biblioteca padrão Python inclui suporte limitado para expressões XPath
- libxml2
- Amara
- Sedna XML Database
- lxml
- Scrapy
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
- Especificação XPath 1.0
- Especificação XPath 2.0
- Especificação XPath 3.0
- Especificação XPath 3.1
- O que há de novo no XPath 2.0
- Referência XPath (MSDN)
- Sintaxe de expressão XPath (saxão)
- Sintaxe de expressão XPath 2.0 (Saxon) , [1]
- XPath - MDC Docs da Mozilla Developer Network
- Introdução / tutorial XPath
- Referência de função XSLT e XPath