Probador XPath
Prueba expresiones XPath contra XML y ve todos los nodos coincidentes
Entrada XML
¿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.
Casos de uso del Probador XPath
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.
| Eje | Ejemplo | Descripción |
|---|---|---|
| child | child::book | Direct children named "book" |
| descendant | descendant::title | All "title" elements at any depth |
| parent | parent::* | The parent of the current node |
| ancestor | ancestor::catalog | All ancestors named "catalog" |
| following-sibling | following-sibling::book | Siblings after the current node |
| preceding-sibling | preceding-sibling::book | Siblings before the current node |
| attribute | attribute::lang | The "lang" attribute of the node |
| self | self::book | The current node if it is "book" |
| descendant-or-self | //title | Shorthand: any "title" in the tree |
| ancestor-or-self | ancestor-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ón | Categoría | Descripción |
|---|---|---|
| text() | Node test | Selects text content of a node |
| position() | Numeric | Returns 1-based position in node set |
| last() | Numeric | Returns size of current node set |
| count() | Numeric | Counts nodes: count(//book) |
| contains() | String | contains(@class, "active") — substring match |
| starts-with() | String | starts-with(title, "The") — prefix match |
| normalize-space() | String | Strips leading/trailing whitespace |
| string-length() | Numeric | Returns character count of a string |
| sum() | Numeric | sum(//price) — totals numeric values |
| not() | Boolean | not(@disabled) — negation |
| name() | String | Returns 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.
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.98from 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) # → Trueimport 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# 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