Articulo de referencia

XPath

XPath ( XML Path Language ) es un lenguaje de expresiones diseñado para admitir la consulta o transformación de documentos XML . Fue definido por el Consorcio World Wide Web (W3...

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

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 diversos criterios. [ 2 ] [ 3 ] En el uso popular (aunque no en la especificación oficial), una expresión XPath se suele denominar simplemente "un XPath".

Originalmente motivado por el deseo de proporcionar una sintaxis y un modelo de comportamiento comunes entre XPointer y XSLT , 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 sencilla 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 utilizada. [ 1 ]

  • XPath 1.0 se convirtió en una recomendación el 16 de noviembre de 1999 y está ampliamente implementado y utilizado, ya sea de forma independiente (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, y su segunda edición se publicó el 14 de diciembre de 2010. Existen varias implementaciones, pero no son tan utilizadas como XPath 1.0. La especificación del lenguaje XPath 2.0 es mucho más extensa que la de XPath 1.0 y modifica 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 el modelo de datos XQuery y XPath (XDM), que cuenta con un sistema de tipos mucho más rico. [ a ] ​​Ahora, cada valor es una secuencia (un único valor atómico o nodo se considera 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 mucho más amplio.
    XPath 2.0 es, de hecho, un subconjunto de XQuery 1.0. Comparten el mismo modelo de datos ( XDM ). Ofrece una forexpresión que es una versión reducida de las expresiones " FLWOR " de 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 la typeswitchexpresión.
  • XPath 3.0 se convirtió en una recomendación el 8 de abril de 2014. [ 4 ] La característica nueva más significativa es la compatibilidad con funciones como valores de primera clase. [ 5 ] 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. [ 6 ] Esta versión agrega nuevos tipos de datos: mapas y matrices, principalmente para respaldar la compatibilidad con JSON .
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', indica la dirección de navegación 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 navegados tengan la etiqueta 'A'. Un predicado se puede usar para especificar que los nodos seleccionados tengan ciertas propiedades, las cuales se especifican mediante las propias expresiones XPath.

La sintaxis XPath se presenta en dos variantes: la sintaxis abreviada , más compacta, permite escribir y leer XPath fácilmente mediante caracteres y estructuras intuitivas y, en muchos casos, familiares. La sintaxis completa es más extensa, pero permite especificar más opciones y resulta 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 XML fuente que contiene al menos

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

La expresión XPath más sencilla adopta una forma como la siguiente:

  • /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 XPath está diseñada para imitar la sintaxis de URI ( Identificador Uniforme de Recursos ) y de ruta de archivo al estilo Unix .

Se pueden construir expresiones más complejas especificando un eje distinto del eje 'hijo' 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

  • A//B/*[1]

Selecciona el primer hijo (' *[1]'), cualquiera que sea su nombre, de cada elemento B que a su vez sea hijo u otro descendiente más profundo (' //') de un elemento A que sea hijo del nodo de contexto actual (la expresión no comienza con un ' /'). El predicado [1]se vincula más fuertemente 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 desde 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 de XPath, el eje (por ejemplo childo descendant-or-self) se especifica explícitamente, 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 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: [ b ]

Como ejemplo del uso del eje de atributos en sintaxis abreviada, //a/@hrefselecciona el atributo llamado hrefen aelementos en cualquier parte del árbol del documento. La expresión . (una abreviatura de self::node() ) se usa comúnmente dentro de un predicado para referirse 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:*encontrará 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()
encuentra un nodo de tipo texto excluyendo cualquier hijo, por ejemplo el helloen<k>hello<m> world</m></k>
instrucción de procesamiento()
encuentra instrucciones de procesamiento XML como . En este caso, coincidiría.<?phpecho$a;?>processing-instruction('php')
nodo()
encuentra cualquier nodo.

Predicados

Los predicados, escritos como expresiones entre corchetes, se pueden usar 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 hay límite en la cantidad de predicados en un paso, y no es necesario que se limiten al último paso de una ruta XPath. También pueden anidarse 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 modifican dicho contexto. Todos los predicados deben cumplirse 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 (según lo da la función position()). Así, p[1]es una abreviatura de y selecciona el primer hijo del elemento, mientras que es una abreviatura de y selecciona el último hijo del nodo de contexto.p[position()=1]pp[last()]p[position()=last()]p

En otros casos, el valor del predicado se convierte automáticamente a un booleano. Cuando el predicado se evalúa a un conjunto de nodos, el resultado es verdadero cuando el conjunto de nodos no está vacío . Por lo tanto, selecciona aquellos elementos que tienen un atributo llamado .p[@x]px

Un ejemplo más complejo: la expresión selecciona el valor del atributo del primer elemento entre los hijos 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 estos 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 de caracteres, números y valores booleanos.

Los operadores disponibles son:

  • Los operadores /, //y [...], utilizados en expresiones de ruta, como se describió anteriormente.
  • Un operador de unión, |, que forma la unión de dos conjuntos de nodos.
  • Operadores booleanos andy or, y una funciónnot()
  • Operadores aritméticos +, -, *, div(división) ymod
  • 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(), redondeo(), piso(), techo()
  • Funciones para obtener propiedades de los nodos: name(), local-name(), namespace-uri()
  • Funciones para obtener información sobre el contexto de procesamiento: position(), last()
  • Funciones de conversión de tipos: string(), number(), boolean()

Algunas de las funciones más útiles se detallan a continuación. [ 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).
recuento( conjunto-de-nodos )
Devuelve el número de nodos en el conjunto de nodos proporcionado como argumento.

funciones de cadena

cadena( objeto ?)
Convierte cualquiera de los cuatro tipos de datos XPath en una cadena de texto según reglas predefinidas. 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 demás.
concatenar( 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-cadena(cadena?)
Devuelve el número de caracteres en la cadena.
normalizar-espacio( cadena ?)
Se eliminan todos los espacios en blanco iniciales y finales , y cualquier secuencia de espacios en blanco se reemplaza por un solo espacio. Esto resulta muy útil cuando el XML original puede haber sido formateado con letra bonita , lo que podría dificultar el procesamiento posterior de la cadena.

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, según las reglas de conversión integradas, y 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 paréntesis y los operadores booleanos y , así como con la función descrita anteriormente. Los cálculos numéricos pueden usar y . Las cadenas pueden constar de cualquier carácter Unicode .=, !=, <=, <, >=>()andornot()*, +, -, divmod

//item[@price>2*@discount]Selecciona artículos cuyo atributo de precio sea mayor que el doble del valor numérico de su atributo de descuento.

Los conjuntos de nodos completos se pueden combinar ( 'unionar' ) 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 velementos que tienen elementos xhijos y, así como todos los welementos que tienen zelementos hijos, 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 ejemplo

<?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= < edición : vietnamita > vi.wiktionary.org </edición> < edición : idioma turco > tr.wiktionary.org </edición> <edición : idioma español > es.wiktionary.org </edición> </ediciones> </proyecto> </proyectos> </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 de 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 las 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

  • La unidad XPath está incluida en las bibliotecas predeterminadas.

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 [ 12 ] a través de la API de Java para el procesamiento de 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

  • Método document.evaluate()[ 13 ] en navegadores web .
  • Complemento jQuery XPath [ 14 ] basado en la implementación de código abierto XPath 2.0 en JavaScript [ 15 ]
  • FontoXPath [ 16 ] Implementación de código abierto de XPath 3.1 en JavaScript. Actualmente en desarrollo.

Marco de trabajo .NET

  • En los espacios de nombres System.Xml y System.Xml.XPath [ 17 ]
  • Base de datos XML de Sedna

Perl

PHP

  • Base de datos XML de Sedna
  • DOMXPath [ 19 ] a través de la extensión libxml

Pitón

  • La API XML ElementTree [ 20 ] en la biblioteca estándar de Python incluye soporte limitado para expresiones XPath.
  • libxml2
  • Amara
  • Base de datos XML de Sedna
  • lxml [ 21 ]
  • Scrapy [ 22 ]

Rubí

Esquema

  • Base de datos XML de Sedna

SQL

  • MySQL admite un subconjunto de XPath desde la versión 5.1.5 en adelante [ 23 ].
  • PostgreSQL admite XPath y XSLT desde la versión 8.4 en adelante [ 24 ].

Tcl

  • El paquete tDOM proporciona una implementación XPath completa, compatible y rápida en C [ 25 ].

Uso en lenguajes de esquema

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

  • El lenguaje de esquemas Schematron (ahora estándar ISO ) fue pionero en este enfoque.
  • En el esquema XML 1.0 del W3C, se utiliza un subconjunto de XPath para expresar restricciones de unicidad y claves. En XSD 1.1, el uso de XPath se amplía para admitir la asignación condicional de tipos basada en valores de atributos y para permitir que se evalúen aserciones booleanas arbitrarias sobre el contenido de los elementos.
  • XForms utiliza XPath para vincular tipos a valores.
  • Este enfoque incluso se ha utilizado en aplicaciones que no son XML, como el analizador de código fuente para Java llamado PMD : el código Java se convierte en un árbol de análisis sintáctico similar al DOM , y luego se definen reglas XPath sobre dicho árbol.

Véase también

Notas

  1. XPath 2.0 admite tipos atómicos, definidos como tipos integrados en XML Schema , y ​​también puede importar tipos definidos por el usuario desde un esquema.
  2. La autoridad en XML Normal Walsh mantiene una excelente visualización en línea de los especificadores de ejes. [ 7 ] De la ilustración se desprende que precedente , antecesor , propio , 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 recomendaciones del W3C .

Referencias

  1. 1 2 "Cronología de los estándares XML y Web Semántica del W3C" (PDF) . 4 de febrero de 2012. Archivado del original (PDF) el 24 de abril de 2013. Consultado el 4 de febrero de 2012 .
  2. Bergeron, Randy (31 de octubre de 2000). "XPath: Recuperación de nodos de un documento XML" . SQL Server Magazine . Archivado del original el 26 de julio de 2010. Consultado el 24 de febrero de 2011 .
  3. Pierre Geneves (2012). "Curso: El lenguaje XPath" (PDF) .
  4. "XML Path Language (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. "XML Path Language (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 eje" . nwalsh.com . Blog personal del venerado sabio XML graybeard . Recuperado el 25 de febrero de 2021 .
  8. http://www.corefiling.com/opensource/pathan.html
  9. "pugixml.org - Inicio" . pugixml.org . Consultado el 27 de julio de 2025 .
  10. "XQilla : Página principal" . Archivado del original el 18 de mayo de 2015. Consultado el 4 de febrero de 2014 . 
  11. "Archivo de Google Code: almacenamiento a largo plazo para el alojamiento de proyectos de Google Code" . code.google.com . Consultado el 27 de julio de 2025 .
  12. "javax.xml.xpath (Java SE 10 y JDK 10)" . Especificación de la API de la plataforma Java®, edición estándar y del kit de desarrollo de Java, versión 10. Consultado el 17 de julio de 2021. Desde: 1.5
  13. "Documento: método evaluate() - API web | MDN" . developer.mozilla.org . Consultado el 17 de noviembre de 2025 .
  14. "GitHub - ilinsky/jquery-xpath: complemento jQuery XPath (con soporte completo para el lenguaje XPath 2.0)" . github.com . Consultado el 27 de julio de 2025 .
  15. "GitHub - ilinsky/xpath2.js: xpath.js - Implementación de XPath 2.0 de código abierto en JavaScript (independiente del DOM)" . github.com . Consultado el 27 de julio de 2025 .
  16. "GitHub - FontoXML/fontoxpath: Una implementación minimalista de XPath 3.1 en JavaScript puro" . github.com . Consultado el 27 de julio de 2025 .
  17. "Espacio de nombres System.Xml" . Microsoft Docs . 25/10/2020 . Consultado el 16/07/2021 .
  18. "XML::LibXML - Enlace Perl para libxml2 - metacpan.org" . metacpan.org . Consultado el 27 de julio de 2025 .
  19. "PHP: DOMXPath - Manual" . www.php.net . Consultado el 27 de julio de 2025 .
  20. "xml.etree.ElementTree â — La API XML de ElementTree — Documentación de Python 3.13.5" . docs.python.org . Consultado el 27-07-2025 .
  21. "lxml - Procesamiento de XML y HTML con Python" . lxml.de. Consultado el 27 de julio de 2025 .
  22. Duke, Justin (29/09/2016). "Cómo rastrear una página web con Scrapy y Python 3" . Digital Ocean . Recuperado el 24/11/2017 . Los selectores son patrones que podemos usar para encontrar uno o más elementos en una página para luego trabajar con los datos dentro del elemento. Scrapy admite selectores CSS o selectores XPath.
  23. "MySQL :: Manual de referencia de MySQL 5.1 :: Funciones XML 12.11" . dev.mysql.com . 6 de abril de 2016. Archivado del original el 6 de abril de 2016. Consultado el 17 de julio de 2021 .  
  24. "xml2" . Documentación de PostgreSQL . 24/07/2014 . Consultado el 16/07/2021 .
  25. Loewer, Jochen (2000). "tDOM – Un paquete XML/DOM/XPath rápido para Tcl escrito en C" (PDF) . Actas de la Primera Reunión Europea de Usuarios de TCL/Tk . Recuperado el 16 de julio de 2021 .
  • 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 expresiones XPath (Saxon)
  • Sintaxis de expresiones XPath 2.0 (Saxon) ,
  • XPath - Documentación de MDC por Mozilla Developer Network
  • Introducción/tutorial de XPath
  • Referencia de funciones XSLT y XPath