Ejemplo 3: Estructuras Anidadas
Cómo crear jerarquías con varios niveles dentro de un mismo documento XML
🎯 ¿En qué consiste este ejemplo?
La anidación es lo que hace útil a XML para representar estructuras complejas: un elemento dentro de otro, dentro de otro. Elige cuántos niveles quieres generar (tienda → categoría → subcategoría → producto...) y PHP construirá el XML de forma recursiva, nivel a nivel, para que veas cómo cada nivel envuelve al siguiente.
Elige la profundidad
<tienda>
└── <categoria>
└── <subcategoria>
└── <producto>
└── <nombre>Ejemplo Producto</nombre>
XML generado (3 niveles)
<?xml version="1.0"?>
<tienda>
<categoria>
<subcategoria>
<producto>
<nombre>Ejemplo Producto</nombre>
</producto>
</subcategoria>
</categoria>
</tienda>
📖 Explicación del Código
Función recursiva en PHP
function construirNivel($padre, $etiquetas, $indice) {
if ($indice >= count($etiquetas)) {
return;
}
$hijo = $padre->addChild($etiquetas[$indice]);
if ($indice === count($etiquetas) - 1) {
$hijo->addChild('nombre', 'Ejemplo');
} else {
construirNivel($hijo, $etiquetas, $indice + 1);
}
}
📝 Recursividad para anidar
¿Qué hace? La función se llama a sí misma pasando el elemento recién creado como nuevo "padre" y avanzando al siguiente nivel del array de etiquetas. Cada llamada añade un nivel más de profundidad al XML.
💡 Concepto: anidación = jerarquía real
En el DOM final, cada elemento generado en una llamada recursiva queda literalmente "dentro" de las etiquetas de apertura y cierre del elemento anterior. Por eso al indentar el XML se ve como un árbol.
📝 Caso base (parar la recursión)
¿Qué hace? Sin esta condición, la función se llamaría a sí misma para siempre. El "caso base" indica cuándo detenerse: cuando ya no quedan más niveles definidos.
🎯 Conceptos Clave Aprendidos
Anidación en XML
- Un elemento puede contener otros elementos
- No hay límite de niveles en la especificación
- Cada nivel debe cerrarse correctamente
Recursividad
- Útil para estructuras de profundidad variable
- Necesita un caso base para no ser infinita
- Cada nivel del XML corresponde a una llamada
Diseño de jerarquías
- Más niveles = más específico, pero más complejo
- Hay que decidir dónde termina la jerarquía
- Debe reflejar relaciones reales entre los datos
💪 Ejercicio Práctico
Diseña tu propia jerarquía
- Prueba los 3 niveles disponibles y compara la profundidad del XML resultante
- Piensa en una estructura de tu propio dominio (por ejemplo: colegio → curso → clase → alumno) y escribe cuántos niveles necesitarías
- ¿Qué pasaría si en vez de un único hijo por nivel, un
<categoria>pudiera tener varios<producto>? Piensa cómo cambiaría la función recursiva (pista: un bucleforeachdentro de cada nivel)
Varios hijos por nivel
function construirNivelMultiple($padre, $datos) {
foreach ($datos as $item) {
$hijo = $padre->addChild('producto');
$hijo->addChild('nombre', $item['nombre']);
// Si $item tuviera sub-hijos, se llamaría de nuevo aquí
}
}
La diferencia clave es usar un foreach para crear varios elementos hermanos en el mismo nivel, en vez de uno solo por nivel.