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

ℹ️ Árbol de esta estructura
<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

construirNivel($hijo, $etiquetas, $indice + 1);

¿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)

if ($indice >= count($etiquetas)) { return; }

¿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

  1. Prueba los 3 niveles disponibles y compara la profundidad del XML resultante
  2. Piensa en una estructura de tu propio dominio (por ejemplo: colegio → curso → clase → alumno) y escribe cuántos niveles necesitarías
  3. ¿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 bucle foreach dentro 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.