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

ℹ️ Documento de muestra
<?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

✅ 4 resultado(s) encontrado(s)
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

$dom->loadXML($xmlBiblioteca);
$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

$resultado = $xpath->evaluate('/biblioteca/libro/titulo');

¿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
  • @atributo selecciona 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 escalares
  • query() siempre devuelve nodos
  • Devuelve false si la expresión es inválida

💪 Ejercicio Práctico

Domina tus propias consultas

  1. Usa los botones rápidos y observa cómo cambia el resultado en cada caso
  2. Escribe una expresión que devuelva solo el autor del libro con id="002"
  3. Escribe una expresión que devuelva los libros publicados antes de 1900
  4. 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