Tutorial XPath (XML Path Language)

En este tutorial de XPath exploraremos los conceptos fundamentales de este lenguaje de consulta y navegación para documentos XML. Aprenderemos cómo utilizar XPath para localizar y seleccionar elementos y atributos específicos dentro de un documento XML.
También abordaremos los diferentes tipos de nodos , como nodos de elemento, atributos, texto y más. Descubriremos cómo utilizar operadores y predicados para refinar nuestras consultas y seleccionar datos de manera más precisa.
Además, exploraremos algunas funciones XPath incorporadas que nos permitirán realizar transformaciones y manipulaciones de datos en nuestros documentos XML.
Al finalizar este tutorial, estarás equipado con los conocimientos necesarios para utilizar XPath de manera efectiva y aprovechar su potencial en el procesamiento y análisis de documentos XML. Si aún no sabes cómo crear un documento XML te recomendamos comenzar el con el tutorial de introducción a XML.
1. Tutorial: Introducción a XPath
La necesidad de manejar documentos XML de manera efectiva llevó al desarrollo de XPath (XML Path Language) por parte del W3C, solo un año después de la especificación XML. XPath es un lenguaje declarativo que permite localizar y dirigirse a partes específicas de un documento XML, proporcionando una sintaxis y un modelo de datos.
XPath se enfocó en la capacidad de localizar componentes de un documento XML y resaltar fragmentos tanto del documento como de entidades externas. Estos fragmentos se denominan subrecursos y una vez identificados, pueden ser utilizados o caracterizados de manera especial.
En definitiva, XPath es un lenguaje diseñado para navegar y operar sobre partes específicas de un documento XML.
2. El árbol de XPath
El árbol XPath, también conocido como árbol de nodos (node tree), es una representación jerárquica (hierarchical representation or hierarchical structure) de un documento XML que nos permite visualizar y navegar por su estructura. En este árbol, cada nodo representa un elemento, atributo, texto u otro tipo de entidad dentro del documento.
El nodo raíz del árbol XPath es el elemento principal (root element) del documento. A partir de este nodo raíz, se ramifican los nodos hijos que representan los elementos secundarios. Cada elemento puede tener nodos hijos, y así sucesivamente, formando una estructura en forma de árbol.
3. Tipos de nodos en un árbol XPath
Los diferentes tipos de nodos en un árbol XPath nos permiten acceder y manipular de manera selectiva los elementos, atributos, texto y otros componentes de un documento XML utilizando expresiones XPath.
Los nodos de un árbol XPath pueden ser de siete tipos:
- Nodo de elemento (Element Node): Representa un elemento en el documento XML, como una etiqueta de apertura y cierre. Ejemplo:
<libro></libro>
- Nodo de atributo (Attribute Node): Representa un atributo de un elemento. Ejemplo:
id="123"
- Nodo de texto (Text Node): Representa el contenido de texto dentro de un elemento. Ejemplo:
"Este es el contenido de texto"
. - Nodo de espacio de nombres (Namespace Node): Representa un espacio de nombres utilizado en el documento XML. Ejemplo:
xmlns:prefix="http://www.example.com"
- Nodo de procesamiento (Processing Instruction Node): Representa una instrucción de procesamiento en el documento XML. Ejemplo:
<?xml version="1.0" encoding="UTF-8"?>
- Nodo de comentario (Comment Node): Representa un comentario dentro del documento XML. Ejemplo:
<!-- Este es un comentario -->
- Nodo de documento o raíz de documento (Document Node or Root Node): Representa el nodo raíz del documento XML. Es el nodo principal que contiene todos los demás nodos.
4. Sintaxis y notación XPath
XPath emplea una sintaxis que se basa en la barra diagonal (/) seguida de una lista de nombres de elementos hijo. Esta secuencia de nombres de elementos describe un camino específico a través del documento XML, permitiendo seleccionar los elementos sucesivos que coinciden con el recorrido especificado. De esta manera, XPath utiliza expresiones de patrón para identificar los nodos deseados dentro del documento.
5. Trayecto de búsqueda
El trayecto de búsqueda se refiere a la secuencia de elementos y relaciones utilizados para localizar nodos específicos en un documento XML. Se establece mediante una combinación de nodos y operadores XPath para crear una ruta o camino que se sigue desde el nodo raíz hasta el nodo deseado.
En todo trayecto de búsqueda de XPath se pueden distinguir tres elementos básicos llamados Ejes, Nodos y Predicados.
5.1. Ejes
Los ejes en XPath son elementos clave para establecer relaciones y navegar a través de los nodos de un documento XML. Cada eje define una dirección o perspectiva particular desde la cual se pueden seleccionar nodos.
Existen 13 tipos de ejes en XPath que se utilizan para realizar búsquedas específicas, siendo los más habituales los siguientes:
- Eje hijo (child axis): Representado por el símbolo
/
, este eje selecciona todos los nodos hijos directos de un nodo en el camino de búsqueda. - Eje descendiente (descendant axis): Representado por el símbolo
//
, este eje selecciona todos los nodos descendientes, es decir, los nodos hijos, los hijos de los hijos y así sucesivamente, de un nodo en el camino de búsqueda. - Eje padre (parent axis): Representado por
..
, este eje selecciona el nodo padre de un nodo en el camino de búsqueda. - Eje ancestro (ancestor axis): Representado por
ancestor::
, este eje selecciona todos los nodos ancestros, es decir, los nodos padre, abuelos, bisabuelos y así sucesivamente, de un nodo en el camino de búsqueda. - Eje siguiente (following axis): Representado por
following::
, este eje selecciona todos los nodos que aparecen después de un nodo en el documento. - Eje anterior (preceding axis): Representado por
preceding::
, este eje selecciona todos los nodos que aparecen antes de un nodo en el documento.
Veamos algunos ejemplos de cómo utilizar los ejes en XPath:
1.Ejemplo: Eje hijo directo (/
)
/library
: Selecciona el nodo «library» que es hijo directo del nodo raíz del documento XML./library/book
: Selecciona todos los nodos «book» que son hijos directos del nodo «library».
2. Ejemplo: Eje descendente (//)
//book
: Selecciona todos los nodos «book» en el documento XML, sin importar su ubicación.
3. Ejemplo: Eje padre (..)
//book/..
: Selecciona el nodo padre de todos los nodos «book» en el documento XML.
4. Ejemplo: Eje ancestro (ancestor::)
//book/ancestor::library
: Selecciona todos los nodos «library» que son ancestros del nodo «book» en el documento XML.
5. Ejemplo: Eje siguiente (following::)
//book/following::publisher
: Selecciona todos los nodos «publisher» que aparecen después de los nodos «book» en el documento XML.
6. Ejemplo: Eje anterior (preceding::)
//book/preceding::year
: Selecciona todos los nodos «year» que aparecen antes de los nodos «book» en el documento XML.
7. Ejemplo: Eje hermano siguiente (following-sibling::)
//book/following-sibling::author
: Selecciona todos los nodos «author» que son hermanos siguientes de los nodos «book» en el documento XML.
8. Ejemplo: Eje hermano anterior (preceding-sibling::)
//book/preceding-sibling::title
: Selecciona todos los nodos «title» que son hermanos anteriores de los nodos «book» en el documento XML.
5.2. Nodos de comprobación o búsqueda
Los nodos de comprobación o búsqueda en XPath se utilizan para evaluar condiciones y seleccionar nodos específicos en un documento XML. Estos nodos permiten realizar comprobaciones sobre los atributos, el contenido de texto y otros aspectos de los elementos XML.
Aquí hay algunos nodos de comprobación comunes en XPath:
- Nodos de atributo: Se utilizan para seleccionar nodos basados en los valores de sus atributos. Por ejemplo,
@id
selecciona todos los nodos que tienen un atributoid
. - Nodos de texto: Se utilizan para seleccionar nodos que contienen un texto específico. Por ejemplo,
text()
selecciona todos los nodos de texto en el documento. - Nodos de posición: Se utilizan para seleccionar nodos basados en su posición en el documento. Por ejemplo,
[1]
selecciona el primer nodo que cumple con los criterios de búsqueda. - Nodos de comparación: Se utilizan para realizar comparaciones entre nodos y valores. Por ejemplo,
>
,<
,=
, etc., se utilizan para comparar valores numéricos o alfanuméricos. - Nodos lógicos: Se utilizan para combinar condiciones y realizar operaciones lógicas. Por ejemplo,
and
,or
,not
se utilizan para realizar operaciones booleanas. - Nodos de tipo
node()
: Se utilizan para seleccionar cualquier tipo de nodo, incluyendo elementos, atributos, texto, etc. - Nodos comodín
*
: Se utilizan para seleccionar cualquier elemento en el documento sin importar su nombre.
Estos nodos de comprobación o búsqueda en XPath son fundamentales para construir expresiones XPath más complejas y selectivas, permitiendo así realizar búsquedas precisas y específicas en un documento XML. Veamos algunos ejemplos de como utilizar los nodos en XPath:
1.Ejemplo: Nodos de atributo @atrib
//@id
: Selecciona todos los nodos que tienen un atributo «id» en cualquier lugar del documento.//book[@category='fiction']
: Selecciona todos los nodos «book» que tienen el atributo «category» con el valor «fiction».
2. Ejemplo: Nodos de texto text()
//title[text()='Introduction to XPath']
: Selecciona el nodo «title» que contiene el texto «Introduction to XPath».
3. Ejemplo: Nodos de posición [1],[2]…
(//book)[1]
: Selecciona el primer nodo «book» en el documento.(//book)[last()]
: Selecciona el último nodo «book» en el documento.
4. Ejemplo: Nodos de comparación >, <, =…
//price > 50
: Selecciona todos los nodos «price» que tienen un valor mayor que 50.
5. Ejemplo: Nodos lógicos and y or
//book[@category='fiction' and @price > 20]
: Selecciona todos los nodos «book» que tienen la categoría «fiction» y un precio mayor que 20.
6. Ejemplo: Nodos de tipo node()
//node()
: Selecciona todos los nodos en el documento, incluyendo elementos, atributos y texto.
7. Ejemplo: Nodos comodín *
//book/*
: Selecciona todos los elementos hijos de los nodos «book» en el documento.
5.3. Predicados
Los predicados en XPath son elementos que permiten restringir el conjunto de nodos seleccionados por un eje, basándose en ciertas condiciones. Estos predicados brindan mayor detalle y permiten filtrar un conjunto de nodos específico.
Para la obtención de un predicado se recurre a identificaciones o a las funciones propias de XPath escritas entre corchetes ([….]).En los apartados anteriores ya se han mostrado algunos ejemplos de predicados que nos han permitido refinar aún más la selección de nodos según múltiples condiciones.
5.4. Operadores aritméticos, lógicos y de comparación.
En las tablas siguientes, puede verse un resumen de los operadores disponibles, los cuales se clasifican en operadores aritméticos, lógicos y de comparación.
Operadores aritméticos Función |
---|
+ suma |
– resta |
* multiplicación |
div resultado entero de la división |
mod módulo |
Operadores de comparación Función |
---|
= igual |
!= no igual |
< menor que; en XSLT, se necesita el operador < |
> mayor que; en XSLT, se recomienda usar el operador > |
<= menor que o igual; en XSLT, se necesita el operador < |
>= Mayor que o igual; en XSLT, se recomienda usar el operador > |
Operadores lógicos Función |
---|
and Operador Y lógico |
or Operador O lógico |
5.5. Funciones XPath
Las funciones en XPath son herramientas incorporadas que permiten realizar operaciones y manipulaciones en los nodos y valores de un documento XML. Estas funciones proporcionan una funcionalidad adicional para buscar, filtrar, transformar y realizar cálculos en los datos XML.
Algunas funciones comunes en XPath son las que se muestran en la siguiente tabla:
Función | Descripción |
---|---|
text() | Devuelve el contenido de texto de un nodo. |
node() | Selecciona el propio nodo. No se suele usar. |
name() | Devuelve el nombre del nodo actual. |
string() | Convierte cualquier valor a cadena. |
string-length() | Devuelve la cantidad de caracteres de la cadena. |
concat() | Concatena varias cadenas de texto en una sola. |
contains() | Verifica si una cadena de texto está presente en otra. |
starts-with() | Verifica si una cadena de texto comienza con otra. |
substring() | Extrae una parte de una cadena de texto. |
substring-after() | Devuelve la subcadena que aparece después de otra subcadena en una cadena de texto. |
substring-before() | Devuelve la subcadena que aparece antes de otra subcadena en una cadena de texto. |
normalize-space() | Elimina espacios en blanco adicionales en una cadena de texto. |
count() | Retorna la cantidad de nodos de un conjunto. |
sum() | Calcula la suma de los valores numéricos de los nodos seleccionados. |
round() | Redondea un número al entero más cercano. |
floor() | Redondea un número hacia abajo al entero más cercano. |
ceiling() | Redondea un número hacia arriba al entero más cercano. |
position() | Devuelve la posición del nodo actual en su contexto. |
last() | Devuelve la posición del último nodo en su contexto. |
not() | Niega una expresión booleana. |
and() | Realiza una operación lógica AND entre dos expresiones booleanas. |
or() | Realiza una operación lógica OR entre dos expresiones booleanas. |
max() | Devuelve el mayor de los valores de una secuencia de valores. |
min() | Devuelve el valor mínimo de la secuencia de valores. |
Veamos algunos ejemplos:
1.Ejemplo de text():
- XPath:
//p/text()
- Resultado: Devuelve el contenido de texto de todos los elementos
<p>
en el documento.
2. Ejemplo de concat():
- XPath:
concat('Hola', ' ', 'Mundo')
- Resultado: Devuelve la cadena de texto «Hola Mundo».
3. Ejemplo de contains():
- XPath:
//div[contains(@class, 'active')]
- Resultado: Devuelve todos los elementos
<div>
que contienen el atributoclass
con el valor «active».
4. Ejemplo de substring():
- XPath:
substring('Hello World', 7, 5)
- Resultado: Devuelve la subcadena «World» de la cadena de texto «Hello World».
5. Ejemplo de count():
- XPath:
count(//li)
- Resultado: Devuelve el número de elementos
<li>
en el documento.
6. Ejemplo de string-length():
- XPath:
string-length('Hello World')
- Resultado: Devuelve la longitud de la cadena de texto «Hello World», en este caso, 11.
7. Ejemplo de last():
- XPath:
//li[last()]
- Resultado: Devuelve el último elemento
<li>
en el documento.
5.6. Trayecto de búsqueda relativo y absoluto
Los trayectos de búsqueda en XPath pueden ser absolutos o relativos, dependiendo de cómo se defina la ruta de búsqueda en relación con el contexto actual.
- El trayecto de búsqueda absoluto comienza desde el nodo raíz del documento XML y especifica la ruta completa hasta el nodo deseado. Se utiliza una barra diagonal (/) al inicio del trayecto para indicar que se parte desde el nodo raíz. Por ejemplo,
/libros/libro
representa un trayecto de búsqueda absoluto que selecciona todos los elementos «libro» que son hijos directos del elemento «libros».
- El trayecto de búsqueda relativo se define en relación con el nodo actual o de referencia. No se utiliza una barra diagonal al inicio del trayecto. En su lugar, se especifica la ruta relativa desde el nodo actual hasta el nodo deseado. Por ejemplo,
libro/titulo
representa un trayecto de búsqueda relativo que selecciona todos los elementos «titulo» que son hijos directos del elemento «libro» en el contexto actual.
La elección entre un trayecto de búsqueda absoluto o relativo depende de la estructura del documento XML y del objetivo de la búsqueda. Los trayectos de búsqueda absolutos son útiles cuando se necesita especificar una ruta precisa desde el nodo raíz. Los trayectos de búsqueda relativos son más flexibles y se adaptan al contexto actual, lo que facilita la navegación dentro de la estructura del documento.
6. Cómo ejecuto una consulta XPath
Para ejecutar una consulta XPath en un documento XML, puedes utilizar diferentes herramientas y lenguajes de programación que admitan XPath:
Herramientas en línea:
- Puedes utilizar herramientas en línea como freeformatter.com/xpath-tester.htm que te permiten insertar el documento XML y la expresión XPath, y te mostrarán el resultado de la consulta en línea. Simplemente busca en un motor de búsqueda «XPath Tester» y encontrarás varias opciones para probar tus consultas. Ten en cuenta que, a veces, algunas algunas herramientas pueden no estar actualizadas y que no reconozca algunas funciones. Por tanto, prueba tus expresiones en varias herramientas para más fiabilidad.
Editor de código con algún complemento:
- Puedes utilizar lenguajes de programación como Python, Java o JavaScript para ejecutar consultas XPath en un documento XML.
- En Python, puedes usar la biblioteca
lxml
o la biblioteca incorporadaxml.etree.ElementTree
para cargar el documento XML y ejecutar consultas XPath. - En Java, puedes utilizar la biblioteca
javax.xml.xpath
para realizar consultas XPath en un documento XML. - En JavaScript, puedes usar el objeto
document.evaluate()
en navegadores web para ejecutar consultas XPath en documentos HTML o XML cargados en el navegador.
Esperamos que este tutorial te haya sido útil para encontrar fácilmente la información que necesitas en documentos XML. Además, si te interesa el mundo de XML, puede que te resulte interesante visitar el tutorial de DTD o el tutorial de XSD para la validación de XML. En la siguiente sección te presentamos diferentes ejercicios resueltos para que puedas comprobar tu aprendizaje sobre XPath.
7. Ejemplos y ejercicios resueltos XPath
Con este conjunto de ejercicios podrás poner en práctica tus habilidades en XPath. Aprenderás a navegar y buscar elementos en documentos XML utilizando diferentes ejes, predicados y funciones XPath. Si utilizas alguna herramienta online para comprobar las expresiones, recuerda que pueden no estar actualizadas y que no soporten algunas funciones.
7.1. Tutorial XPath. Ejercicio resuelto: Catálogo de libros
Dado el siguiente documento XML que representa un catálogo de libros:
<catalog> <book> <title>XML in Practice</title> <author>Joe Marini</author> <year>2002</year> <price>39.95</price> </book> <book> <title>Learning XPath</title> <author>John Smith</author> <year>2010</year> <price>29.99</price> </book> <book> <title>Advanced XML Techniques</title> <author>Lisa Johnson</author> <year>2015</year> <price>49.99</price> </book> </catalog>
Escribe consultas XPath para resolver las siguientes preguntas:
- Obtén el título de todos los libros.
- Encuentra el autor de los libros publicados después de 2005.
- Encuentra el libro más caro.
- Obtén los títulos de los libros escritos por autores cuyo nombre comienza con la letra «J».
- Encuentra el año de publicación del libro cuyo título contiene la palabra «XPath».
Solución:
- Consulta XPath:
//title
Resultado: «XML in Practice», «Learning XPath», «Advanced XML Techniques» - Consulta XPath:
//book2023/author
Resultado: «John Smith», «Lisa Johnson» - Consulta XPath:
//book[price = max(//book/price)]
Resultado: «Advanced XML Techniques» - Consulta XPath:
//book[starts-with(author, 'J')]/title
Resultado: «XML in Practice», «Learning XPath» - Consulta XPath:
//book[contains(title, 'XPath')]/year
Resultado: «2010»
7.2. Tutorial XPath. Ejercicio resuelto: Lista de estudiantes
Dado el siguiente documento XML que representa una lista de estudiantes y sus calificaciones:
<students> <student> <name>John Smith</name> <grades> <grade subject="Math">85</grade> <grade subject="Science">92</grade> <grade subject="History">78</grade> </grades> </student> <student> <name>Alice Johnson</name> <grades> <grade subject="Math">90</grade> <grade subject="Science">87</grade> <grade subject="History">92</grade> </grades> </student> <student> <name>Emma Davis</name> <grades> <grade subject="Math">95</grade> <grade subject="Science">88</grade> <grade subject="History">91</grade> </grades> </student> </students>
Escribe consultas XPath para resolver las siguientes preguntas:
- Obtén el nombre de todos los estudiantes.
- Encuentra la calificación más alta en el área de Ciencias (Science).
- Encuentra el promedio de calificaciones de todos los estudiantes en Matemáticas (Math).
- Obtén el nombre de los estudiantes que tienen una calificación de Historia (History) mayor a 80.
- Encuentra el estudiante con el promedio de calificaciones más alto.
Solución:
- Consulta XPath:
//name
Resultado: «John Smith», «Alice Johnson», «Emma Davis» - Consulta XPath:
//grade[@subject='Science' and . = max(//grade[@subject='Science'])]
Resultado: «92» - Consulta XPath:
sum(//grade[@subject='Math']) div count(//grade[@subject='Math'])
Resultado: «90» - Consulta XPath:
//student[grades/grade[@subject='History'] > 80]/name
Resultado: «Alice Johnson», «Emma Davis» - Consulta XPath:
//student[sum(grades/grade) = max(//student/sum(grades/grade))]/name
Resultado: «Emma Davis»
7.3. Tutorial XPath. Ejercicio resuelto: Lista de empleados
Dado el siguiente documento XML que representa una lista de empleados de una empresa:
<employees> <employee> <name>John Smith</name> <age>35</age> <department>IT</department> <salary>50000</salary> </employee> <employee> <name>Alice Johnson</name> <age>28</age> <department>HR</department> <salary>45000</salary> </employee> <employee> <name>Michael Davis</name> <age>42</age> <department>Finance</department> <salary>60000</salary> </employee> <employee> <name>Sarah Brown</name> <age>31</age> <department>IT</department> <salary>55000</salary> </employee> </employees>
Escribe consultas XPath para resolver las siguientes preguntas:
- Obtén el nombre de todos los empleados del departamento de IT.
- Encuentra la edad promedio de los empleados en el departamento de HR.
- Encuentra el salario más alto entre todos los empleados.
- Obtén el nombre del empleado más joven.
- Encuentra el nombre de los empleados que tienen un salario mayor a 50000 y pertenecen al departamento de IT.
Solución:
- Consulta XPath:
//employee[department = 'IT']/name
Resultado: «John Smith», «Sarah Brown» - Consulta XPath:
sum(//employee[department = 'HR']/age) div count(//employee[department = 'HR'])
Resultado: «28» - Consulta XPath:
max(//salary)
Resultado: «60000» - Consulta XPath:
//employee[age = min(//employee/age)]/name
Resultado: «Alice Johnson» - Consulta XPath:
//employee[salary > 50000 and department = 'IT']/name
Resultado: «John Smith», «Sarah Brown»