stringtranslate.com

XPath

XPath ( XML Path Language ) es un lenguaje de expresión diseñado para admitir la consulta o transformación de documentos XML . Fue definido por el World Wide Web Consortium (W3C) en 1999, [1] y se puede utilizar para calcular valores (por ejemplo, cadenas , números o valores booleanos ) a partir del contenido de un documento XML. El soporte para XPath existe en aplicaciones que admiten XML, como navegadores web y muchos lenguajes de programación.

Descripción general

El lenguaje XPath se basa en una representación en árbol del documento XML y proporciona la capacidad de navegar por el árbol, seleccionando nodos según una variedad de criterios. [2] [3] En el uso popular (aunque no en la especificación oficial), a menudo se hace referencia a una expresión XPath simplemente como "un XPath".

Originalmente motivados por el deseo de proporcionar un modelo de sintaxis y comportamiento común entre XPointer y XSLT , los subconjuntos del lenguaje de consulta XPath se utilizan en otras especificaciones del W3C como XML Schema , XForms y el Internationalization Tag Set (ITS) .

XPath ha sido adoptado por varias bibliotecas y herramientas de procesamiento XML, muchas de las cuales también ofrecen selectores CSS , otro estándar del W3C, como una alternativa más simple a XPath.

Versiones

Existen 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 ampliamente disponible. [1]

Expresión XPath aplicada a un archivo XML

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:

Una expresión XPath se evalúa con respecto a un nodo de contexto . Un especificador de eje como 'child' o 'descendant' especifica la dirección en la que se debe 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 tengan la etiqueta 'A'. Se puede utilizar un predicado para especificar que los nodos seleccionados tengan ciertas propiedades, que se especifican mediante las propias expresiones XPath.

La sintaxis XPath se presenta en dos versiones: la sintaxis abreviada , que es más compacta y permite escribir y leer XPaths fácilmente mediante caracteres y construcciones intuitivas 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. Dado el código fuente XML que contiene al menos

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

El XPath más simple tiene una forma como esta:

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 XPath está diseñada para imitar la sintaxis de ruta de archivo de estilo Unix y URI ( Uniform Resource Identifier ) .

Se pueden construir expresiones más complejas especificando un eje distinto del eje "secundario" predeterminado, una prueba de nodo distinta de un nombre simple o predicados, que se pueden escribir entre corchetes después de cualquier paso. Por ejemplo, la expresión

selecciona el primer hijo (' *[1]'), cualquiera que sea su nombre, de cada elemento B que sea en sí mismo un hijo u otro descendiente más profundo (' //') de un elemento A que sea un hijo del nodo de contexto actual (la expresión no comienza con un ' /'). El predicado [1]se vincula 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 los conjuntos de nodos XPath) comienzan desde 1, no 0 como es común en lenguajes como C y Java.

Sintaxis expandida

En la sintaxis completa, sin abreviar, los dos ejemplos anteriores se escribirían

Aquí, en cada paso del XPath, se especifica explícitamente el eje (por ejemplo child, o descendant-or-self), seguido de ::y luego la prueba del nodo , como Ao node()en los ejemplos anteriores.

Aquí lo mismo, pero más corto:A//B/*[position()=1]

Especificadores de ejes

Los especificadores de eje indican la dirección de navegación dentro de la representación en árbol del documento XML. Los ejes disponibles son: [b]

Como ejemplo de uso del atributo axis en sintaxis abreviada, //a/@hrefselecciona el atributo llamado hrefen aelementos en cualquier parte del árbol del documento. La expresión . (abreviatura de self::node() ) se utiliza con mayor frecuencia dentro de un predicado para hacer referencia al nodo seleccionado actualmente. Por ejemplo, h3[.='See also']selecciona un elemento llamado h3en el contexto actual, cuyo contenido de texto es See also.

Pruebas de nodos

Las pruebas de nodos pueden consistir en nombres de nodos específicos o expresiones más generales. En el caso de un documento XML en el que gsse ha definido el prefijo de espacio de nombres, //gs:enquiryencontrará todos los enquiryelementos en ese espacio de nombres y //gs:*todos los elementos, independientemente del nombre local, en ese espacio de nombres.

Otros formatos de prueba de nodos son:

comentario()
encuentra un nodo de comentario XML, por ejemplo<!-- Comment -->
texto()
busca un nodo de tipo texto excluyendo a todos los hijos, p. ej., el helloin<k>hello<m> world</m></k>
instrucción de procesamiento()
Busca instrucciones de procesamiento XML como . En este caso, coincidiría.<?php echo $a; ?>processing-instruction('php')
nodo()
encuentra cualquier nodo.

Predicados

Los predicados, escritos como expresiones entre corchetes, se pueden utilizar para filtrar un conjunto de nodos según alguna condición. Por ejemplo, adevuelve un conjunto de nodos (todos los aelementos que son hijos del nodo de contexto) y conserva solo aquellos elementos que tienen un atributo con el valor .a[@href='help.php']hrefhelp.php

No existe límite para la cantidad de predicados en un paso y no es necesario que se limiten al último paso de una 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 de nodo inmediatamente anterior) y no alteran ese contexto. Se deben satisfacer todos los predicados para que se produzca una coincidencia.

Cuando el valor del predicado es numérico, es una sintaxis sencilla para comparar con la posición del nodo en el conjunto de nodos (tal como lo indica la función position()). Por lo tanto, p[1]es una abreviatura de y selecciona el primer elemento secundario, mientras que es una abreviatura de y selecciona el último elemento secundario del nodo de contexto.p[position()=1]pp[last()]p[position()=last()]p

En otros casos, el valor del predicado se convierte automáticamente en un valor 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 [ aclarar ] . Por lo tanto, p[@x]se seleccionan aquellos pelementos que tienen un atributo denominado x.

Un ejemplo más complejo: la expresión selecciona el valor del atributo del primer elemento entre los elementos secundarios del nodo de contexto que tiene su atributo establecido en , siempre que el elemento de nivel superior del documento también tenga un atributo establecido 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í.a[/html/@lang='en'][@href='help.php'][1]/@targettargetahrefhelp.phphtmllangen

El orden de los predicados es importante 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. Por lo tanto, encontrará una coincidencia solo si el primer hijo del nodo de contexto satisface la condición , mientras que encontrará el primer hijo que satisface esta condición.a[1][@href='help.php']a@href='help.php'a[@href='help.php'][1]a

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:

La biblioteca de funciones incluye:

A continuación se detallan algunas de las funciones más útiles. [c]

Funciones del 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).
count( conjunto-de-nodos )
devuelve el número de nodos en el conjunto de nodos suministrado como argumento.

Funciones de cadena

cadena( objeto ?)
Convierte cualquiera de los cuatro tipos de datos XPath en una cadena según 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 posteriores.
concat( cadena , cadena , cadena *)
concatena dos o más cadenas
comienza con( s1 , s2 )
devuelve truesi s1comienza cons2
contiene( s1 , s2 )
devuelve truesi s1contienes2
subcadena( cadena , inicio , longitud ?)
ejemplo: substring("ABCDEF",2,3)devuelve BCD.
subcadena-antes( s1 , s2 )
ejemplo: substring-before("1999/04/01","/")devuelve1999
subcadena-después( s1 , s2 )
ejemplo: substring-after("1999/04/01","/")devuelve04/01
longitud de cadena(cadena?)
devuelve el número de caracteres en la cadena
normalizar-espacio( cadena ?)
Se eliminan todos los espacios iniciales y finales 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 sido formateado con formato prettyprint , lo que podría hacer que el procesamiento posterior de la cadena no sea confiable.

Funciones booleanas

no( booleano )
Niega cualquier expresión booleana.
verdadero()
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

Se pueden crear expresiones dentro de predicados utilizando los operadores: =, !=, <=, <, >=y >. Las expresiones booleanas se pueden combinar con corchetes ()y los operadores booleanos andy , orasí como con la not()función descrita anteriormente. Los cálculos numéricos pueden utilizar *, +, -, divy 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 conjuntos de nodos completos ( 'unirse' ) utilizando el carácter de barra vertical |. Se pueden encontrar conjuntos de nodos que cumplen una o más de varias condiciones 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 velementos que tienen elementos xsecundarios y, así como todos los welementos que tienen zelementos secundarios, que se encontraron en el contexto actual.

Sintaxis y semántica (XPath 2.0)

Sintaxis y semántica (XPath 3)

Ejemplos

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= "Inglés" > en.wikipedia.org </edition> < edition language = "Alemán" > de.wikipedia.org </edition> <edition language= "Francés" > fr.wikipedia.org </edition> <edition language= "Polaco" > pl.wikipedia.org </edition> <edition language= "Español" > es.wikipedia.org </edition> </editions> </project> <project name= "Wikcionario" launch= "2002-12-12" > <editions> < edition language= "Inglés" > en.wiktionary.org </edition> <edition language= "Francés" > fr.wiktionary.org </edition> <edition language= "vietnamita" > vi.wiktionary.org </edition> <edition language= "turco" > tr.wiktionary.org </edition> <edition language= "español" > es.wiktionary.org </edition> </editions> </project> </projects> </Wikimedia>                                  

La expresión XPath

/Wikimedia/proyectos/proyecto/@nombre

selecciona atributos de nombre para todos los proyectos y

/Wikimedia//ediciones

selecciona todas las ediciones de todos los proyectos, y

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

Selecciona las direcciones de todos los proyectos Wikimedia en inglés (texto de todos editionlos elementos donde languageel atributo es igual a English ). Y lo siguiente

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

selecciona direcciones de todas las Wikipedias (texto de todos editionlos elementos que existen bajo projectel elemento con un atributo de nombre de Wikipedia ).

Implementaciones

Herramientas de línea de comandos

C/C++

Pascal libre

Implementaciones para motores de bases de datos

Java

El paquete Javajavax.xml.xpath ha sido parte de la edición estándar de Java desde Java 5 [8] a través de la API de Java para procesamiento XML . Técnicamente, se trata de una API XPath en lugar de una implementación XPath, y permite al programador seleccionar una implementación específica que se ajuste a la interfaz.

JavaScript

Marco .NET

Perl

PHP

Pitón

Rubí

Esquema

SQL

Tcl

Uso en lenguajes de esquema

XPath se utiliza cada vez más para expresar restricciones en lenguajes de esquema para XML.

Véase también

Notas

  1. ^ XPath 2.0 admite tipos atómicos, definidos como tipos integrados en el esquema XML , y también puede importar tipos definidos por el usuario desde un esquema.
  2. ^ Autoridad XML Normal Walsh mantiene una excelente visualización en línea de los especificadores de eje. [7] De la ilustración se desprende que precedente , antecesor , yo , descendiente y siguiente forman una partición completa, ordenada y no superpuesta del árbol de elementos del documento.
  3. ^ Para una descripción completa, consulte el documento de Recomendación del W3C.

Referencias

  1. ^ ab "Cronología de estándares W3C para XML y Web semántica" (PDF) . 2012-02-04.
  2. ^ Bergeron, Randy (31 de octubre de 2000). "XPath: recuperación de nodos de un documento XML". SQL Server Magazine . Archivado desde el original el 26 de julio de 2010. Consultado el 24 de febrero de 2011 .
  3. ^ Pierre Geneves (2012). "Curso: El lenguaje XPath" (PDF) .
  4. ^ "Lenguaje de rutas XML (XPath) 3.0". Consorcio World Wide Web (W3C) . 2 de abril de 2014. Consultado el 16 de julio de 2021 .
  5. ^ Kay, Michael (10 de febrero de 2012). "Novedades de la versión 3.0 (XSLT/XPath/XQuery) (más XML Schema 1.1)" (PDF) . XML Prague 2012. Consultado el 16 de julio de 2021 .
  6. ^ "Lenguaje de rutas XML (XPath) 3.1". Consorcio World Wide Web (W3C) . 21 de marzo de 2017. Consultado el 16 de julio de 2021 .
  7. ^ Walsh, Norman (1999). "Especificadores de ejes". nwalsh.com . Blog personal del venerado sabio de XML graybeard . Consultado el 25 de febrero de 2021 .
  8. ^ "javax.xml.xpath (Java SE 10 y JDK 10)". Especificación de la API de Java® Platform, Standard Edition y Java Development Kit versión 10. Consultado el 17 de julio de 2021. Desde: 1.5
  9. ^ "Espacio de nombres System.Xml". Microsoft Docs . 2020-10-25 . Consultado el 2021-07-16 .
  10. ^ Duke, Justin (29 de septiembre de 2016). "Cómo rastrear una página web con Scrapy y Python 3". Digital Ocean . Consultado el 24 de noviembre de 2017. Los selectores son patrones que podemos usar para encontrar uno o más elementos en una página para que luego podamos trabajar con los datos dentro del elemento. Scrapy admite selectores CSS o selectores XPath.
  11. ^ "MySQL :: Manual de referencia de MySQL 5.1 :: Funciones XML 12.11". dev.mysql.com . 2016-04-06. Archivado desde el original el 2016-04-06 . Consultado el 2021-07-17 .{{cite web}}: CS1 maint: unfit URL (link)
  12. ^ "xml2". Documentación de PostgreSQL . 2014-07-24 . Consultado el 2021-07-16 .
  13. ^ Loewer, Jochen (2000). "tDOM – Un paquete rápido XML/DOM/XPath para Tcl escrito en C" (PDF) . Actas de la primera reunión europea de usuarios de TCL/Tk . Consultado el 16 de julio de 2021 .

Enlaces externos