XPath - XPath
Paradigma | Lenguaje de consulta |
---|---|
Desarrollador | W3C |
Apareció por primera vez | 1998 |
Lanzamiento estable | 3.1 / 21 de marzo de 2017
|
Influenciado por | |
XSLT , XPointer | |
Influenciado | |
Esquema XML , XForms |
XPath ( XML Path Language ) es un lenguaje de consulta para seleccionar nodos de un documento XML . Además, XPath se puede utilizar para calcular valores (por ejemplo, cadenas , números o valores booleanos ) a partir del contenido de un documento XML. XPath fue definido por el World Wide Web Consortium (W3C).
Visión general
El lenguaje XPath se basa en una representación de árbol del documento XML y proporciona la capacidad de navegar por el árbol, seleccionando nodos según una variedad de criterios. En el uso popular (aunque no en la especificación oficial), una expresión XPath a menudo se denomina simplemente "un XPath".
Originalmente motivados por el deseo de proporcionar una sintaxis y un modelo de comportamiento comunes entre XPointer y XSLT , los subconjuntos del lenguaje de consulta XPath se utilizan en otras especificaciones del W3C como XML Schema , XForms y el conjunto de etiquetas de internacionalización (ITS) .
XPath ha sido adoptado por varias bibliotecas y herramientas de procesamiento XML, muchas de las cuales también ofrecen selectores de CSS , otro estándar W3C, como una alternativa más simple a XPath.
Versiones
Hay varias versiones de XPath en uso. XPath 1.0 se publicó en 1999, XPath 2.0 en 2007 (con una segunda edición en 2010), XPath 3.0 en 2014 y XPath 3.1 en 2017. Sin embargo, XPath 1.0 sigue siendo la versión más disponible.
- XPath 1.0 se convirtió en una Recomendación el 16 de noviembre de 1999 y se implementa y utiliza ampliamente, ya sea por sí solo (llamado a través de una API desde lenguajes como Java , C # , Python o JavaScript ), o integrado en lenguajes como XSLT , XProc , XML Schema o XForms.
-
XPath 2.0 se convirtió en una Recomendación el 23 de enero de 2007, con una segunda edición publicada el 14 de diciembre de 2010. Existen varias implementaciones, pero no se utilizan tan ampliamente como XPath 1.0. La especificación del lenguaje XPath 2.0 es mucho mayor que XPath 1.0 y cambia algunos de los conceptos fundamentales del lenguaje, como el sistema de tipos.
- El cambio más notable es que XPath 2.0 se basa en XQuery y XPath Data Model (XDM) que tiene un sistema de tipos mucho más rico. Cada valor es ahora una secuencia (un solo valor atómico o nodo se considera como una secuencia de longitud uno). Los conjuntos de nodos de XPath 1.0 se reemplazan por secuencias de nodos, que pueden estar en cualquier orden.
- Para admitir conjuntos de tipos más ricos, XPath 2.0 ofrece un conjunto de funciones y operadores muy ampliado.
- XPath 2.0 es de hecho un subconjunto de XQuery 1.0. Comparten el mismo modelo de datos ( XDM ). Ofrece una
for
expresión que es una versión reducida de las expresiones " FLWOR " en XQuery. Es posible describir el lenguaje enumerando las partes de XQuery que omite: los ejemplos principales son el prólogo de la consulta, los constructores de elementos y atributos, el resto de la sintaxis "FLWOR" y latypeswitch
expresión.
- XPath 3.0 se convirtió en una recomendación el 8 de abril de 2014. La nueva característica más significativa es la compatibilidad con funciones como valores de primera clase. XPath 3.0 es un subconjunto de XQuery 3.0 y la mayoría de las implementaciones actuales (abril de 2014) existen como parte de un motor XQuery 3.0.
- XPath 3.1 se convirtió en una recomendación el 21 de marzo de 2017. Esta versión agrega nuevos tipos de datos: mapas y arreglos, en gran parte para respaldar la compatibilidad con JSON .
Sintaxis y semántica (XPath 1.0)
El tipo de expresión más importante en XPath es una ruta de ubicación . Una ruta de ubicación consta de una secuencia de pasos de ubicación . Cada paso de ubicación tiene tres componentes:
- un eje
- una prueba de nodo
- cero o más predicados .
Una expresión XPath se evalúa con respecto a un nodo de contexto . Un especificador de eje como 'hijo' o 'descendiente' especifica la dirección para navegar desde el nodo de contexto. La prueba de nodo y el predicado se utilizan para filtrar los nodos especificados por el especificador de eje: por ejemplo, la prueba de nodo 'A' requiere que todos los nodos a los que se navegue deben tener la etiqueta 'A'. Se puede usar un predicado para especificar que los nodos seleccionados tienen ciertas propiedades, que son especificadas por las propias expresiones XPath.
La sintaxis XPath viene en dos versiones: la sintaxis abreviada , es más compacta y permite escribir y leer XPaths fácilmente usando caracteres y construcciones intuitivos y, en muchos casos, familiares. La sintaxis completa es más detallada, pero permite especificar más opciones y es más descriptiva si se lee con atención.
Sintaxis abreviada
La notación compacta permite muchos valores predeterminados y abreviaturas para casos comunes. XML de origen dado que contiene al menos
<A>
<B>
<C/>
</B>
</A>
el XPath más simple toma una forma como
/A/B/C
que selecciona elementos C que son hijos de elementos B que son hijos del elemento A que forma el elemento más externo del documento XML. La sintaxis de XPath está diseñada para imitar la sintaxis de ruta de archivo de estilo URI ( Identificador uniforme de recursos ) y Unix .
Se pueden construir expresiones más complejas especificando un eje que no sea el eje 'hijo' predeterminado, una prueba de nodo que no sea un nombre simple o predicados, que se pueden escribir entre corchetes después de cualquier paso. Por ejemplo, la expresión
A//B/*[1]
selecciona el primer hijo (' *[1]
'), cualquiera que sea su nombre, de cada elemento B que es hijo u otro descendiente más profundo (' //
') de un elemento A que es hijo del nodo de contexto actual (la expresión no empieza con una ' /
'). Tenga en cuenta que el predicado se [1]
une más estrechamente que el /
operador. Para seleccionar el primer nodo seleccionado por la expresión A//B/*
, escriba (A//B/*)[1]
. Tenga en cuenta también que los valores de índice en los predicados XPath (técnicamente, 'posiciones de proximidad' de conjuntos de nodos XPath) comienzan desde 1, no 0 como es común en lenguajes como C y Java.
Sintaxis ampliada
En la sintaxis completa y sin abreviar, los dos ejemplos anteriores se escribirían
/child::A/child::B/child::C
child::A/descendant-or-self::node()/child::B/child::node()[position()=1]
Aquí, en cada paso del XPath, el eje (por ejemplo, child
o descendant-or-self
) se especifica explícitamente, seguido de ::
y luego la prueba del nodo , como A
o node()
en los ejemplos anteriores.
Aquí lo mismo, pero más corto:
A//B/*[position()=1]
Especificadores de eje
Los especificadores de eje indican la dirección de navegación dentro de la representación de árbol del documento XML. Los ejes disponibles son:
Sintaxis completa | Sintaxis abreviada | Notas |
---|---|---|
ancestor |
||
ancestor-or-self |
||
attribute
|
@
|
@abc es la abreviatura de attribute::abc
|
child |
xyz es la abreviatura de child::xyz
|
|
descendant |
||
descendant-or-self
|
//
|
// es la abreviatura de /descendant-or-self::node()/
|
following |
||
following-sibling |
||
namespace |
||
parent
|
..
|
.. es la abreviatura de parent::node()
|
preceding |
||
preceding-sibling |
||
self
|
.
|
. es la abreviatura de self::node()
|
Como ejemplo del uso del eje de atributos en sintaxis abreviada, //a/@href
selecciona el atributo llamado href
en a
elementos en cualquier parte del árbol del documento. La expresión . (una abreviatura de self :: node () ) se usa más comúnmente dentro de un predicado para referirse al nodo seleccionado actualmente. Por ejemplo, h3[.='See also']
selecciona un elemento llamado h3
en el contexto actual, cuyo contenido de texto es See also
.
Pruebas de nodo
Las pruebas de nodo pueden consistir en nombres de nodo específicos o expresiones más generales. En el caso de un documento XML en el que gs
se ha definido el prefijo del espacio de nombres , //gs:enquiry
encontrará todos los enquiry
elementos en ese espacio de nombres y //gs:*
encontrará todos los elementos, independientemente del nombre local, en ese espacio de nombres.
Otros formatos de prueba de nodo son:
- comentario()
- encuentra un nodo de comentario XML, p. ej.
<!-- Comment -->
- texto()
- encuentra un nodo de tipo texto, por ejemplo, el
hello world
en<k>hello<m> world</m></k>
- instrucción-de-procesamiento ()
- encuentra instrucciones de procesamiento XML como
<?php echo $a; ?>
. En este caso,processing-instruction('php')
coincidiría. - nodo()
- encuentra cualquier nodo en absoluto.
Predicados
Los predicados, escritos como expresiones entre corchetes, se pueden usar para filtrar un conjunto de nodos según alguna condición. Por ejemplo, a
devuelve un conjunto de nodos (todos los a
elementos que son hijos del nodo de contexto) y a[@href='help.php']
conserva solo los elementos que tienen un href
atributo con el valor help.php
.
No hay límite para el número de predicados en un paso y no es necesario limitarlos al último paso de un XPath. También se pueden anidar a cualquier profundidad. Las rutas especificadas en los predicados comienzan en el contexto del paso actual (es decir, el de la prueba del nodo inmediatamente anterior) y no alteran ese contexto. Todos los predicados deben satisfacerse para que se produzca una coincidencia.
Cuando el valor del predicado es numérico, es azúcar sintáctico para comparar con la posición del nodo en el conjunto de nodos (como lo indica la función position()
). Por tanto, p[1]
es una abreviatura de p[position()=1]
y selecciona el primer p
elemento secundario, mientras que p[last()]
es una abreviatura de p[position()=last()]
y selecciona el último elemento p
secundario del nodo de contexto.
En otros casos, el valor del predicado se convierte automáticamente a booleano. Cuando el predicado se evalúa como un conjunto de nodos, el resultado es verdadero cuando el conjunto de nodos no está vacío . De esta forma p[@x]
selecciona aquellos p
elementos que tienen un atributo nombrado x
.
Un ejemplo más complejo: la expresión a[/html/@lang='en'][@href='help.php'][1]/@target
selecciona el valor del target
atributo del primer a
elemento entre los hijos del nodo de contexto que tiene su href
atributo establecido en help.php
, siempre que el html
elemento de nivel superior del documento también tenga un lang
atributo establecido en en
. La referencia a un atributo del elemento de nivel superior en el primer predicado no afecta ni al contexto de otros predicados ni al del paso de ubicación en sí.
El orden de los predicados es significativo si los predicados prueban la posición de un nodo. Cada predicado toma un conjunto de nodos y devuelve un conjunto de nodos (potencialmente) más pequeño. Entonces a[1][@href='help.php']
encontrará una coincidencia solo si el primer a
hijo del nodo de contexto satisface la condición @href='help.php'
, mientras a[@href='help.php'][1]
que encontrará el primer a
hijo que satisfaga esta condición.
Funciones y operadores
XPath 1.0 define cuatro tipos de datos: conjuntos de nodos (conjuntos de nodos sin orden intrínseco), cadenas, números y valores booleanos.
Los operadores disponibles son:
- Los operadores "/", "//" y "[...]", utilizados en las expresiones de ruta, como se describió anteriormente.
- Un operador de unión, "|", que forma la unión de dos conjuntos de nodos.
- Operadores booleanos "y" y "o", y una función "no ()"
- Operadores aritméticos "+", "-", "*", "div" (dividir) y "mod"
- Operadores de comparación "=", "! =", "<", ">", "<=", "> ="
La biblioteca de funciones incluye:
- Funciones para manipular cadenas: concat (), substring (), contains (), substring-before (), substring-after (), translate (), normalize-space (), string-length ()
- Funciones para manipular números: suma (), ronda (), piso (), techo ()
- Funciones para obtener propiedades de los nodos: name (), local-name (), namespace-uri ()
- Funciones para obtener información sobre el contexto de procesamiento: posición (), último ()
- Funciones de conversión de tipos: cadena (), número (), booleano ()
Algunas de las funciones más útiles se detallan a continuación.
Funciones de conjunto de nodos
- posición()
- devuelve un número que representa la posición de este nodo en la secuencia de nodos que se están procesando actualmente (por ejemplo, los nodos seleccionados por una instrucción xsl: for-each en XSLT).
- contar ( conjunto de nodos )
- devuelve el número de nodos del conjunto de nodos proporcionado como argumento.
Funciones de cadena
- cadena ( objeto ?)
- convierte cualquiera de los cuatro tipos de datos XPath en una cadena de acuerdo con las reglas integradas. Si el valor del argumento es un conjunto de nodos, la función devuelve el valor de cadena del primer nodo en el orden del documento, ignorando los nodos adicionales.
- concat ( cadena , cadena , cadena *)
- concatena dos o más cadenas
- comienza con ( s1 , s2 )
- devuelve
true
sis1
comienza cons2
- contiene ( s1 , s2 )
- devuelve
true
sis1
contienes2
- subcadena ( cadena , inicio , longitud ?)
- ejemplo:
substring("ABCDEF",2,3)
devuelve"BCD"
. - subcadena antes ( s1 , s2 )
- ejemplo:
substring-before("1999/04/01","/")
devuelve1999
- substring-after ( s1 , s2 )
- ejemplo:
substring-after("1999/04/01","/")
devuelve04/01
- longitud de cadena (cadena?)
- devuelve el número de caracteres en una cadena
- normalizar-espacio ( cadena ?)
- todos los espacios en blanco iniciales y finales se eliminan y cualquier secuencia de caracteres de espacio en blanco se reemplaza por un solo espacio. Esto es muy útil cuando el XML original puede haber tenido un formato bastante impreso, lo que podría hacer que el procesamiento posterior de cadenas no sea confiable.
Funciones booleanas
- no ( booleano )
- niega cualquier expresión booleana.
- cierto()
- se evalúa como verdadero .
- falso()
- se evalúa como falso .
Funciones numéricas
- suma ( conjunto de nodos )
- convierte los valores de cadena de todos los nodos encontrados por el argumento XPath en números, de acuerdo con las reglas de conversión integradas, luego devuelve la suma de estos números.
Ejemplos de uso
Las expresiones se pueden crear dentro de predicados usando los operadores: =, !=, <=, <, >=
y >
. Las expresiones booleanas se pueden combinar con corchetes ()
y los operadores booleanos and
y or
también con la not()
función descrita anteriormente. Los cálculos numéricos pueden usar *, +, -, div
y mod
. Las cadenas pueden constar de cualquier carácter Unicode .
//item[@price > 2*@discount]
selecciona artículos cuyo atributo de precio es mayor que el doble del valor numérico de su atributo de descuento.
Se pueden combinar ( 'unir' ) conjuntos de nodos completos usando el carácter de barra vertical |. Los conjuntos de nodos que cumplen una o más de varias condiciones se pueden encontrar combinando las condiciones dentro de un predicado con ' or
'.
v[x or y] | w[z]
devolverá un único conjunto de nodos que consta de todos los v
elementos que tienen x
o y
elementos secundarios, así como todos los w
elementos que tienen z
elementos secundarios, que se encontraron en el contexto actual.
Sintaxis y semántica (XPath 2.0)
Sintaxis y semántica (XPath 3)
Ejemplos de
Dado un documento XML de muestra
<?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>
La expresión XPath
/Wikimedia/projects/project/@name
selecciona atributos de nombre para todos los proyectos, y
/Wikimedia//editions
selecciona todas las ediciones de todos los proyectos, y
/Wikimedia/projects/project/editions/edition[@language='English']/text()
selecciona las direcciones de todos los proyectos de Wikimedia en inglés (texto de todos los elementos de la edición donde el atributo de idioma es igual al inglés ). Y lo siguiente
/Wikimedia/projects/project[@name='Wikipedia']/editions/edition/text()
selecciona las direcciones de todas las Wikipedias (texto de todos los elementos de la edición que existen en el elemento del proyecto con un atributo de nombre de Wikipedia ).
Implementaciones
Herramientas de línea de comandos
- XMLStarlet herramienta fácil de usar para probar / ejecutar comandos XPath sobre la marcha.
- xmllint (libxml2)
- RaptorXML Server de Altova es compatible con XPath 1.0, 2.0 y 3.0
- Xidel
C / C ++
Pascal libre
- La unidad XPath está incluida en las bibliotecas predeterminadas
Implementaciones para motores de bases de datos
Java
- Saxon XSLT es compatible con XPath 1.0, XPath 2.0 y XPath 3.0 (así como con XSLT 2.0, XQuery 3.0 y XPath 3.0)
- BaseX (también es compatible con XPath 2.0 y XQuery)
- VTD-XML
- Sedna XML Database Ambos XML: DB y propietario.
- QuiXPath, una implementación de streaming de código abierto de Innovimax
- Xalan
- Dom4j
El
paquete Javajavax.xml.xpath
ha sido parte de la edición estándar de Java desde Java 5 a través de la API de Java para procesamiento XML . Técnicamente, se trata de una API de XPath en lugar de una implementación de XPath, y permite al programador la capacidad de seleccionar una implementación específica que se ajuste a la interfaz.
JavaScript
- Complemento jQuery XPath basado en la implementación de XPath 2.0 de código abierto en JavaScript
- FontoXPath Implementación de XPath 3.1 de código abierto en JavaScript. Actualmente en desarrollo.
.NET Framework
- En los espacios de nombres System.Xml y System.Xml.XPath
- Base de datos XML de Sedna
Perl
- XML :: LibXML (libxml2)
PHP
- Base de datos XML de Sedna
- DOMXPath a través de la extensión libxml
Pitón
- La API XML ElementTree en la biblioteca estándar de Python incluye soporte limitado para expresiones XPath
- libxml2
- Amara
- Base de datos XML de Sedna
- lxml
- Scrapy
Rubí
Esquema
- Base de datos XML de Sedna
SQL
- MySQL admite un subconjunto de XPath desde la versión 5.1.5 en adelante
- PostgreSQL es compatible con XPath y XSLT desde la versión 8.4 en adelante
Tcl
- El paquete tDOM proporciona una implementación XPath completa, compatible y rápida en C
Usar en lenguajes de esquema
XPath se utiliza cada vez más para expresar restricciones en lenguajes de esquema para XML.
- El lenguaje de esquema (ahora estándar ISO ) Schematron fue pionero en este enfoque.
- Se utiliza un subconjunto de transmisión de XPath en W3C XML Schema 1.0 para expresar exclusividad y restricciones clave. En XSD 1.1, el uso de XPath se amplía para admitir la asignación de tipo condicional basada en valores de atributo y para permitir la evaluación de aserciones booleanas arbitrarias frente al contenido de los elementos.
- XForms usa XPath para vincular tipos a valores.
- El enfoque incluso ha encontrado uso en aplicaciones que no son XML, como el analizador de código fuente para Java llamado PMD : Java se convierte en un árbol de análisis similar al DOM , luego las reglas XPath se definen sobre el árbol.
Ver también
Notas
Referencias
enlaces externos
- Especificación XPath 1.0
- Especificación XPath 2.0
- Especificación XPath 3.0
- Especificación XPath 3.1
- Novedades de XPath 2.0
- Referencia de XPath (MSDN)
- Sintaxis de expresión XPath (sajón)
- Sintaxis de expresión XPath 2.0 (sajón) , [1]
- XPath - MDC Docs de Mozilla Developer Network
- Introducción / tutorial de XPath
- Referencia de funciones XSLT y XPath