ToolDeck

Probador XPath

Prueba expresiones XPath contra XML y ve todos los nodos coincidentes

Prueba un ejemplo

Entrada XML

Se ejecuta localmente · Es seguro pegar secretos

¿Qué es XPath?

XPath (XML Path Language) es un lenguaje de consulta para seleccionar nodos de un documento XML. Definido por el W3C como parte del estándar XSLT, XPath trata un documento XML como un árbol de nodos y proporciona una sintaxis basada en rutas para navegar por ese árbol. Una expresión XPath como //book[@category="fiction"]/title selecciona todos los elementos title dentro de un elemento book cuyo atributo category es igual a "fiction". XPath 1.0, la versión admitida por todos los navegadores principales y la mayoría de las bibliotecas XML, fue publicada como Recomendación W3C en 1999 y sigue siendo la versión más ampliamente desplegada.

Las expresiones XPath devuelven uno de cuatro tipos de resultado: conjuntos de nodos, cadenas, números o booleanos. Un conjunto de nodos es el resultado más común y contiene cero o más nodos XML (elementos, atributos, nodos de texto, comentarios o instrucciones de procesamiento). Los resultados de tipo cadena, número y booleano provienen de funciones XPath como count(), sum(), contains() y comparaciones booleanas. Este sistema de tipos hace que XPath sea adecuado tanto para extraer datos como para escribir lógica condicional en hojas de estilo XSLT y aserciones de XML Schema.

Las expresiones de la versión 1.0 funcionan en todas partes: document.evaluate() en JavaScript, lxml y ElementTree en Python, javax.xml.xpath en Java, DOMXPath en PHP, y herramientas de línea de comandos como xmllint. Las versiones 2.0 y 3.1 añaden sistemas de tipos más ricos y funciones adicionales, pero requieren motores dedicados como Saxon. Usa la versión 1.0 por defecto. Recurre a 2.0 o 3.1 solo cuando necesites secuencias, expresiones regulares o funciones de orden superior — y acepta la dependencia de Saxon o BaseX.

¿Por qué usar un Probador XPath online?

Escribir expresiones correctas requiere entender la estructura del documento y probarlas contra datos reales. Esta herramienta te ofrece un entorno interactivo para iterar sobre expresiones sin configurar un proyecto ni escribir código repetitivo.

Prueba expresiones al instante
Pega tu XML, escribe una expresión y ve los nodos coincidentes en tiempo real. Sin paso de compilación, sin configurar un REPL, sin dependencias que instalar.
🔒
Procesamiento con privacidad primero
Todo el análisis de XML y la evaluación de consultas se ejecuta en tu navegador usando las APIs nativas DOMParser y document.evaluate(). Tus datos XML nunca salen de tu máquina.
🔍
Depura consultas complejas paso a paso
Descompón expresiones largas probando cada eje y predicado por separado. Ve exactamente qué nodos coinciden en cada paso para aislar los errores.
📋
Copia resultados para documentación
Copia nodos coincidentes o resultados escalares con un clic. Útil para pegar en informes de errores, aserciones de pruebas o scripts de extracción de datos.

Casos de uso del Probador XPath

Desarrollador frontend
Prueba selectores XPath para manipulación de SVG o configuración basada en XML antes de integrarlos en código JavaScript que llama a document.evaluate().
Ingeniero backend
Valida consultas contra respuestas SOAP o payloads de APIs XML antes de escribir la lógica de extracción en Python, Java o Go.
DevOps / Infraestructura
Consulta archivos de configuración XML (Maven pom.xml, Spring beans, configuraciones de pipelines CI) para extraer versiones de dependencias o verificar ajustes sin editar los archivos.
QA / Automatización de pruebas
Construye y verifica localizadores XPath para Selenium o Playwright antes de añadirlos a los scripts de prueba. Prueba casos límite como atributos ausentes o prefijos de namespace.
Ingeniero de datos
Crea prototipos de consultas para feeds de datos XML (RSS, Atom, informes financieros XBRL) antes de integrarlos en pipelines ETL.
Estudiante / aprendiz
Experimenta con ejes, predicados y funciones XPath usando XML de ejemplo. Ve los resultados de inmediato para desarrollar intuición sobre los patrones de recorrido del árbol.

Referencia de ejes XPath

Un eje define la dirección de navegación relativa al nodo actual (contexto). La sintaxis completa es axis::node-test[predicate], aunque la mayoría de los desarrolladores usan las formas abreviadas (//, @, ..) a diario. Esta tabla lista todos los ejes de la versión 1.0 con ejemplos prácticos.

EjeEjemploDescripción
childchild::bookDirect children named "book"
descendantdescendant::titleAll "title" elements at any depth
parentparent::*The parent of the current node
ancestorancestor::catalogAll ancestors named "catalog"
following-siblingfollowing-sibling::bookSiblings after the current node
preceding-siblingpreceding-sibling::bookSiblings before the current node
attributeattribute::langThe "lang" attribute of the node
selfself::bookThe current node if it is "book"
descendant-or-self//titleShorthand: any "title" in the tree
ancestor-or-selfancestor-or-self::*Current node plus all ancestors

Funciones XPath 1.0

El lenguaje define 27 funciones integradas en cuatro categorías: conjunto de nodos, cadena, número y booleano. Estas son las funciones que usarás con más frecuencia al escribir consultas. Todas son compatibles con este probador y con cualquier implementación conforme.

FunciónCategoríaDescripción
text()Node testSelects text content of a node
position()NumericReturns 1-based position in node set
last()NumericReturns size of current node set
count()NumericCounts nodes: count(//book)
contains()Stringcontains(@class, "active") — substring match
starts-with()Stringstarts-with(title, "The") — prefix match
normalize-space()StringStrips leading/trailing whitespace
string-length()NumericReturns character count of a string
sum()Numericsum(//price) — totals numeric values
not()Booleannot(@disabled) — negation
name()StringReturns element or attribute name

Ejemplos de código

Estos ejemplos muestran cómo evaluar expresiones de forma programática. Cada fragmento usa la misma estructura catalog.xml para que puedas comparar las diferencias de API entre lenguajes.

JavaScript (browser)
const xml = `<catalog>
  <book id="1"><title>1984</title><price>7.99</price></book>
  <book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>`

const parser = new DOMParser()
const doc = parser.parseFromString(xml, 'application/xml')

// Select all book titles
const result = doc.evaluate('//book/title', doc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null)
let node = result.iterateNext()
while (node) {
  console.log(node.textContent) // → "1984", "Dune"
  node = result.iterateNext()
}

// Get a numeric value
const sum = doc.evaluate('sum(//price)', doc, null, XPathResult.NUMBER_TYPE, null)
console.log(sum.numberValue) // → 20.98
Python (lxml)
from lxml import etree

xml = """<catalog>
  <book id="1"><title>1984</title><price>7.99</price></book>
  <book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>"""

tree = etree.fromstring(xml.encode())

# Select elements by attribute
books = tree.xpath('//book[@id="1"]/title/text()')
print(books)  # → ['1984']

# Use predicates with position
first = tree.xpath('//book[1]/title/text()')
print(first)  # → ['1984']

# Boolean check
has_cheap = tree.xpath('boolean(//price[. < 10])')
print(has_cheap)  # → True
Java (javax.xml.xpath)
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import org.w3c.dom.*;

var factory = DocumentBuilderFactory.newInstance();
var builder = factory.newDocumentBuilder();
var doc = builder.parse(new java.io.File("catalog.xml"));

var xpath = XPathFactory.newInstance().newXPath();

// Select node set
NodeList titles = (NodeList) xpath.evaluate(
    "//book/title", doc, XPathConstants.NODESET
);
for (int i = 0; i < titles.getLength(); i++) {
    System.out.println(titles.item(i).getTextContent());
    // → "1984", "Dune"
}

// Evaluate to number
double total = (double) xpath.evaluate(
    "sum(//price)", doc, XPathConstants.NUMBER
);
System.out.println(total); // → 20.98
CLI (xmllint)
# Select all book titles
xmllint --xpath '//book/title/text()' catalog.xml
# → 1984Dune

# Select by attribute
xmllint --xpath '//book[@id="2"]/title' catalog.xml
# → <title>Dune</title>

# Count nodes
xmllint --xpath 'count(//book)' catalog.xml
# → 2

# Using xmlstarlet for formatted output
xmlstarlet sel -t -v '//book/title' -n catalog.xml
# → 1984
# → Dune

Preguntas frecuentes

¿Cuál es la diferencia entre XPath 1.0 y XPath 3.1?
La versión 1.0 tiene cuatro tipos de datos (conjunto de nodos, cadena, número, booleano) y 27 funciones. La versión 3.1 añade secuencias, mapas, arrays, tipos de fecha y hora, expresiones regulares, funciones de orden superior y soporte para JSON. Los navegadores y la mayoría de las bibliotecas estándar solo implementan la versión 1.0. La versión 3.1 requiere un motor dedicado como Saxon.
¿Cómo selecciono nodos con un valor de atributo específico?
Usa un predicado con el atajo @ para el eje de atributo. Por ejemplo, //book[@category="fiction"] selecciona todos los elementos book donde el atributo category es igual a "fiction". Puedes combinar múltiples predicados: //book[@category="fiction"][@year > 2000].
¿Por qué mi XPath no devuelve resultados aunque el XML contiene elementos coincidentes?
La causa más común son los namespaces XML. Si tu XML declara un namespace por defecto (xmlns="..."), los elementos pertenecen a ese namespace aunque no tengan prefijo. En la versión 1.0, debes registrar el namespace y usar un prefijo en tu expresión. En JavaScript del navegador, pasa un resolver de namespace como tercer argumento a document.evaluate().
¿Puede XPath modificar contenido XML?
No. Es un lenguaje de consulta de solo lectura. Selecciona y evalúa nodos, pero no puede insertarlos, eliminarlos ni actualizarlos. Para modificar XML, usa transformaciones XSLT, métodos de manipulación del DOM, o una biblioteca como lxml de Python que proporciona APIs separadas para la edición.
¿Qué significa la doble barra (//) en XPath?
La doble barra es el atajo para el eje descendant-or-self. La expresión //title significa "selecciona todos los elementos title en cualquier parte del árbol del documento, a cualquier profundidad". Es equivalente a la forma completa /descendant-or-self::node()/title. Usar // al inicio de una expresión busca en todo el documento; usarlo en medio de la ruta (como /catalog//title) busca entre los descendientes de un nodo específico.
¿Cómo selecciono el contenido de texto en lugar del nodo elemento?
Añade /text() al final de tu expresión. Por ejemplo, //book/title/text() devuelve el contenido de texto de cada elemento title como un nodo de cadena, en lugar del nodo elemento en sí. En código, también puedes acceder a .textContent sobre el nodo elemento devuelto sin usar text().
¿Es XPath más rápido que los selectores CSS para consultar XML?
Los selectores CSS están optimizados para HTML y el recorrido del DOM en navegadores. XPath es más expresivo: admite recorrido hacia el padre, ejes de hermanos, predicados numéricos y funciones integradas que los selectores CSS no pueden expresar. Para HTML, los selectores CSS (querySelector) suelen ser más rápidos. Para XML, la mayoría de las bibliotecas del lado del servidor solo exponen XPath — los selectores CSS no son una opción en absoluto.