¿Qué es esta herramienta?
XPath (XML Path Language) es un estándar del W3C para navegar y seleccionar nodos —elementos, atributos, texto— dentro de un documento XML mediante una sintaxis compacta de tipo ruta, por ejemplo `//book[price>30]/title` selecciona cada `<title>` cuyo `<price>` hermano sea mayor que 30, en cualquier parte del documento. Lo utilizan las hojas de estilo XSLT, las herramientas de validación XML, los scrapers web, los frameworks de automatización de navegador (Selenium, Playwright) y las bibliotecas XML de muchos lenguajes de programación.
La versión actual implementada por todos los navegadores principales —Chrome, Firefox, Safari, Edge— es XPath 1.0, la Recomendación original del W3C de 1999. Esta herramienta utiliza exactamente ese motor nativo a través de la API `document.evaluate()` del navegador, así que los resultados coinciden con lo que obtendrías desde las DevTools del navegador o desde cualquier JavaScript ejecutado en un navegador. No implementa las especificaciones posteriores XPath 2.0/3.0/3.1 (que añaden funciones como `for`, secuencias y coincidencias con expresiones regulares); consulta las preguntas frecuentes para saber qué implica esto en la práctica.
Una expresión puede devolver uno de dos tipos de resultado: un conjunto de nodos (node-set, cero o más elementos, atributos o nodos de texto coincidentes, que esta herramienta serializa y lista uno por línea junto con el recuento), o un valor escalar —un número, una cadena o un booleano— cuando la propia expresión calcula un valor, como `count(//book)` o `//book[1]/title = 'Dune'`.
¿Por qué utilizarlo?
- Depura una expresión XPath antes de incrustarla en un scraper web, una prueba de Selenium/Playwright o una hoja de estilo XSLT.
- Comprueba rápidamente si una expresión XPath dada selecciona el nodo que esperas a partir de una muestra real de XML/HTML.
- Consulta recuentos de coincidencias exactos y la salida serializada en lugar de adivinar a partir del código.
- Obtén errores inmediatos y legibles cuando el XML esté mal formado o la sintaxis XPath sea inválida, en lugar de una traza de error críptica.
- 100 % en el cliente: tu XML y tu expresión nunca salen de tu navegador.
Cómo utilizarlo
- Pega o edita tu XML (o HTML) en el cuadro de entrada; hay precargado un documento de ejemplo de una librería para que veas cómo funciona de inmediato.
- Escribe una expresión XPath en el campo de expresión, o edita el ejemplo precargado.
- Haz clic en «Evaluar» (o pulsa Enter en el campo de expresión).
- Consulta los nodos coincidentes que aparecen debajo, con el recuento en la parte superior; los resultados escalares (números, cadenas, booleanos) se muestran directamente.
- Si el XML o la expresión no son válidos, un mensaje de error específico sustituye a los resultados.
Ejemplo
Entrada
XML:
<bookstore>
<book><title>The Great Gatsby</title><price>12.99</price></book>
<book><title>Learning XPath</title><price>34.50</price></book>
<book><title>Dune</title><price>45.00</price></book>
</bookstore>
XPath: //book[price>30]/titleResultado
✓ 2 node(s) matched
<title>Learning XPath</title>
<title>Dune</title>Solo 2 de los 3 libros tienen un precio superior a 30, así que se devuelven exactamente 2 elementos <title>; el tercer libro (Gatsby, $12.99) queda correctamente excluido.
XPath frente a selectores CSS de un vistazo
Ambos lenguajes seleccionan nodos de un documento, pero resuelven problemas distintos. Usa esta tabla para elegir la herramienta adecuada para cada selección.
| Capacidad | XPath | Selectores CSS |
|---|---|---|
| Seleccionar por etiqueta/clase/id hacia abajo | Sí | Sí, y normalmente más rápido |
| Seleccionar por contenido visible/de texto | Sí — `contains(text(),'x')` | No |
| Ascender hasta un padre/ancestro | Sí — `//div[span]/..` | No (`:has()` es una excepción parcial más reciente) |
| Comparaciones entre valores de hermanos (p. ej. `price>30`) | Sí | No |
| Funciona fuera del navegador (herramientas XML del lado del servidor, XSLT) | Sí | No: los selectores CSS son específicos del navegador/DOM |
Herramientas relacionadas
¿Trabajas con formatos de datos estructurados? Estas herramientas combinan bien con las pruebas de XPath.
Preguntas frecuentes
¿Para qué se usa XPath?
XPath selecciona nodos —elementos, atributos o texto— dentro de un documento XML o HTML mediante una sintaxis de rutas. Es el lenguaje de selección detrás de las transformaciones XSLT, de muchos validadores XML, y se usa ampliamente en web scraping y en la automatización de pruebas de navegador (Selenium, Playwright, Cypress) para localizar elementos en una página, sobre todo cuando los selectores CSS por sí solos no pueden expresar la condición necesaria.
XPath frente a selectores CSS: ¿cuál debería usar?
Se solapan, pero no son equivalentes. XPath puede seleccionar un elemento padre en función del contenido de un hijo (`//div[span='Total']`), ascender hacia los elementos ancestros y seleccionar por texto visible (`//button[contains(text(),'Submit')]`); los selectores CSS no pueden subir por el árbol ni comparar por contenido de texto en absoluto. Si solo estás seleccionando por etiqueta, clase o ID descendiendo por el documento, los selectores CSS son más sencillos de escribir y, en general, más rápidos de evaluar. Recurre a XPath específicamente cuando necesites «seleccionar el padre de este texto» o «seleccionar por lo que dice el elemento», no solo por su etiqueta o clase.
¿Esta herramienta admite funciones de XPath 2.0 o 3.0?
No, y tampoco lo hace ningún navegador. Los navegadores implementan XPath 1.0 (la Recomendación del W3C de 1999) mediante `document.evaluate()`, y esta herramienta usa exactamente ese motor nativo, así que es fiel a lo que obtendrías ejecutando la misma expresión en las DevTools del navegador o en JavaScript. Las funciones y características introducidas en XPath 2.0/3.0/3.1 (como las expresiones `for`, las secuencias o `matches()` con expresiones regulares) no están disponibles; aquí solo funcionan las funciones de 1.0, como `contains()`, `starts-with()`, `substring()`, `count()`, `position()` y `last()`.
¿Cuáles son algunas expresiones XPath comunes que debería conocer?
`//tag` selecciona todos los `<tag>` en cualquier parte del documento. `//tag[@attr='value']` selecciona elementos `<tag>` cuyo atributo `attr` sea igual a `value`. `//tag[contains(text(),'x')]` selecciona elementos `<tag>` cuyo texto directo contenga `x`. `//tag[1]` selecciona el primer `<tag>` hermano dentro de cada padre. `//parent/child` selecciona elementos `<child>` que sean hijos directos de `<parent>`. `count(//tag)` devuelve un número en lugar de un conjunto de nodos.
¿Esta herramienta gestiona los espacios de nombres XML?
Solo se admite correctamente el caso habitual sin espacio de nombres, que cubre la gran mayoría del XML/HTML escrito a mano o extraído mediante scraping. Si tu documento declara un espacio de nombres XML (por ejemplo, `xmlns="..."` en el elemento raíz), `document.evaluate` requiere una función de resolución que conozca los espacios de nombres y que asocie prefijos con URIs, algo que esta herramienta sencilla no configura; las expresiones sobre XML con espacios de nombres pueden devolver cero coincidencias incluso cuando parecen correctas. Es una limitación conocida, no un error: elimina la declaración del espacio de nombres de tu muestra, o usa la función local-name() (por ejemplo, `//*[local-name()='title']`) como solución alternativa.
¿Se envía mi XML o mi expresión XPath a un servidor?
No. Todo se ejecuta localmente usando el `DOMParser` y el `document.evaluate()` integrados en tu navegador, el mismo motor que tu navegador ya usa internamente. Nada de lo que escribas o pegues sale nunca de tu dispositivo.