Cómo usar XPath para encontrar datos en XML (con ejemplos)
XPath es un pequeño lenguaje para señalar partes de un documento XML, un poco como una ruta señala un archivo en tu ordenador. En lugar de leer todo el archivo, escribes //book/title y obtienes todos los títulos de libros. Se usa en XSLT, en herramientas de pruebas como Selenium, en importaciones de datos, en archivos de configuración y en casi cualquier lenguaje de programación que lea XML.
Esta guía recorre el XPath que de verdad vas a usar, con resultados reales, usando el probador de XPath gratuito. Todos los ejemplos funcionan sobre el propio Ejemplo del probador, así que puedes seguirlos paso a paso.
El XML de ejemplo
Una pequeña tienda con dos libros:
<shop name="Corner Books">
<book id="bk101" lang="en">
<title>XML & JSON for Everyone</title>
<author>Ada Lovelace</author>
<price currency="EUR">29.95</price>
<inStock>true</inStock>
<tag>data</tag>
<tag>web</tag>
</book>
<book id="bk102" lang="de">
<title>Daten für alle</title>
<author>Alan Turing</author>
<price currency="EUR">24.50</price>
<inStock>false</inStock>
<tag>data</tag>
<discount/>
</book>
</shop>Cómo probar una expresión XPath
- Abre el probador de XPath. Haz clic en Ejemplo para cargar la tienda de arriba, o pega tu propio XML o abre un archivo.
- Escribe una expresión en Expresión XPath. La línea de debajo dice ✓ Expresión XPath válida en cuanto está completa. Los botones de Prueba: rellenan ejemplos listos.
- Pulsa Intro o haz clic en Ejecutar XPath. Verás cuántos nodos coinciden, cada uno con su tipo (elemento, atributo, texto…) y su línea; haz clic en el número de línea para saltar a ella en el XML.
Las piezas básicas
/baja un nivel desde donde estás; al principio significa “desde la raíz del documento”.//busca a cualquier profundidad.//titleencuentra los títulos estén donde estén.@indica un atributo:@ides el atributo id.[ ]filtra: solo se quedan los nodos que cumplen la condición.*coincide con cualquier elemento,.es el nodo actual y..su padre.
Seleccionar datos
//book/title: el elemento title de cada libro → 2 coincidencias: “XML & JSON for Everyone” y “Daten für alle”//title/text(): solo el texto dentro de los títulos → los mismos dos textos, sin etiquetas//book/@id: el atributo id de cada libro → bk101 y bk102/shop/@name: el atributo name del elemento superior → Corner Books//price/@currency: la moneda de cada precio → EUR y EUR
Filtrar con condiciones
//book[@lang='en']/title: títulos de los libros cuyo atributo lang es “en” → XML & JSON for Everyone//book[price > 25]/title: títulos de los libros que cuestan más de 25 → XML & JSON for Everyone//book[tag='web']/author: autores de los libros con la etiqueta “web” → Ada Lovelace//book[inStock='true']/title: libros disponibles → XML & JSON for Everyone//book[discount]/@id: libros que tienen un elemento discount → bk102//title[contains(., 'JSON')]: títulos que contienen la palabra JSON → XML & JSON for Everyone//book[1]/author: el autor del primer libro → Ada Lovelace//book[last()]/title: el título del último libro → Daten für alle//*[not(node())]: elementos vacíos, que a menudo son errores → <discount/>
Las condiciones se combinan con and y or, por ejemplo //book[@lang='en' and price > 25].
Contar y sumar
XPath también puede devolver un solo valor en lugar de nodos:
count(//book): cuántos libros hay → 2sum(//price): la suma de todos los precios → 54.45boolean(//book[price > 100]): ¿hay algún libro de más de 100? → false
Dos errores que comete casi todo el mundo
1. La trampa del espacio de nombres por defecto
Muchos archivos reales, como los feeds RSS y Atom, los sitemaps, los archivos de Office o los mensajes SOAP, empiezan con un espacio de nombres por defecto:
<feed xmlns="http://www.w3.org/2005/Atom">
<entry><title>Hello</title></entry>
</feed>Aquí //entry/title no encuentra nada, porque todos los elementos pertenecen a ese espacio de nombres y un nombre simple no coincide. Busca por el nombre local: //*[local-name()='entry']/*[local-name()='title']. El probador de XPath detecta esta situación y te avisa.
2. Funciones de versiones más nuevas de XPath
Los navegadores, Selenium y la mayoría de bibliotecas usan XPath 1.0. Las funciones de XPath 2.0 y posteriores, como lower-case(), matches() o ends-with(), no existen ahí. Para ignorar mayúsculas y minúsculas en XPath 1.0 usa translate(), y para comprobar cómo termina un valor compara un substring().
Detalles más pequeños
- Las posiciones empiezan en 1, no en 0:
//book[1]es el primer libro. - Las comparaciones de texto son exactas, con mayúsculas, minúsculas y espacios:
[tag='Web']no coincide con “web”. - Para poner comillas dentro de comillas, alterna el tipo:
//book[title="Daten für alle"]o[title='…'].
Más herramientas XML
- XML a JSON y XML a CSV: convierte el archivo entero cuando ya sepas qué contiene. Lee también cómo convertir XML a JSON.
- Formateador de XML: haz legible primero un archivo de una sola línea. El probador solo funciona con XML bien formado; consulta cómo formatear y validar XML.
¿Se sube mi XML?
No. El XPath se ejecuta en tu navegador, así que tu XML nunca sale de tu dispositivo. Nuestro servidor solo registra que hubo una prueba, para el límite diario.
Preguntas frecuentes
¿Qué versión de XPath usa el probador?
XPath 1.0, la que llevan los navegadores y usan Selenium y la mayoría de bibliotecas, así que una expresión que funciona aquí funciona también allí.
¿Puedo probar XPath en una página web (HTML)?
Este probador necesita XML bien formado, y la mayoría de páginas web no lo son. Para una página abierta, usa la consola de las herramientas de desarrollo del navegador: en Chrome y Edge, $x("//h1") ejecuta un XPath sobre la página.
¿Por qué mi expresión no devuelve nada?
Comprueba primero si hay un espacio de nombres por defecto, y después las mayúsculas y los espacios en las comparaciones de texto. Empieza con una ruta corta como //book y añade un paso cada vez.
Más artículos
- Cómo convertir XML a JSON: atributos, arrays y tipos explicados
- Cómo convertir JSON a CSV para Excel y Google Sheets
- Cómo convertir imágenes a PDF: un solo archivo y del tamaño justo
- ¿Qué es el marcado schema? Una guía sencilla de JSON-LD
- Cómo crear un código QR que funcione (gratis, sin caducidad ni registro)