Ejemplo 6: Consultas XPath
Busca y selecciona nodos concretos dentro de un documento XML
🎯 ¿En qué consiste este ejemplo?
XPath es un lenguaje de rutas para "preguntarle" a un documento XML por
nodos concretos, igual que una ruta de carpetas señala un archivo. Este ejemplo ejecuta,
de verdad, la expresión que escribas contra el documento de muestra (una biblioteca de 4
libros) usando SimpleXMLElement::xpath(), y te muestra los nodos encontrados.
Escribe una expresión XPath
<?xml version="1.0" encoding="UTF-8"?>
<biblioteca>
<libro id="001" genero="Novela">
<titulo>El Quijote</titulo>
<autor>Miguel de Cervantes</autor>
<anio>1605</anio>
</libro>
<libro id="002" genero="Realismo magico">
<titulo>Cien anios de soledad</titulo>
<autor>Gabriel Garcia Marquez</autor>
<anio>1967</anio>
</libro>
<libro id="003" genero="Novela">
<titulo>Orgullo y prejuicio</titulo>
<autor>Jane Austen</autor>
<anio>1813</anio>
</libro>
<libro id="004" genero="Gotica">
<titulo>Dracula</titulo>
<autor>Bram Stoker</autor>
<anio>1897</anio>
</libro>
</biblioteca>
Resultado de la consulta
El Quijote --- Cien anios de soledad --- Orgullo y prejuicio --- Dracula
📖 Explicación del Código
Código PHP Completo
<?php
$dom = new DOMDocument();
$dom->loadXML($xmlBiblioteca);
$xpath = new DOMXPath($dom);
$resultado = $xpath->evaluate('/biblioteca/libro/titulo');
foreach ($resultado as $nodo) {
echo $nodo->textContent, "\n";
}
?>
📝 Cargar el documento y crear el motor de consultas
$xpath = new DOMXPath($dom);
¿Qué hace? Carga el XML en un DOMDocument y crea un objeto DOMXPath asociado a él, que es el que sabe ejecutar expresiones XPath sobre ese documento.
📝 Ejecutar la consulta
¿Qué hace? Devuelve los nodos que coinciden con la ruta indicada, o un valor escalar (número, texto o booleano) si la expresión es del tipo count(...). /biblioteca/libro/titulo se lee como "desde la raíz, entra en biblioteca, luego en cada libro, y coge su titulo".
💡 Concepto: rutas, filtros y funciones
// busca en cualquier nivel, los corchetes [...] filtran por condición (por ejemplo [@genero='Novela'] por atributo, o [anio > 1900] por valor de un hijo), y funciones como count() devuelven un número en lugar de nodos.
🎯 Conceptos Clave Aprendidos
Sintaxis de rutas
/ruta absoluta desde la raíz//busca en cualquier nivel@atributoselecciona atributos
Filtros con corchetes
[@id='003']filtra por atributo[anio > 1900]filtra por valor[contains(texto, 'x')]busca subcadenas
DOMXPath en PHP
evaluate()admite nodos y escalaresquery()siempre devuelve nodos- Devuelve
falsesi la expresión es inválida
💪 Ejercicio Práctico
Domina tus propias consultas
- Usa los botones rápidos y observa cómo cambia el resultado en cada caso
- Escribe una expresión que devuelva solo el autor del libro con
id="002" - Escribe una expresión que devuelva los libros publicados antes de 1900
- Intenta escribir una expresión con un corchete sin cerrar y observa el mensaje de error
Autor del libro con id="002"
/biblioteca/libro[@id='002']/autor
Libros anteriores a 1900
/biblioteca/libro[anio < 1900]/titulo