W3docs

getchildren()

SimpleXML es una extensión de PHP que ofrece una API sencilla para trabajar con documentos XML. SimpleXMLElement::children() obtiene los hijos directos.

SimpleXMLElement::children()

SimpleXML es una extensión de PHP que proporciona una API directa para analizar y manipular documentos XML. Entre sus métodos, SimpleXMLElement::children() permite recuperar los elementos hijo inmediatos de un nodo como objetos SimpleXMLElement para poder iterar sobre ellos. Esta guía explica qué devuelve el método, cómo gestiona los espacios de nombres y cómo utilizarlo en documentos reales.

El alias más antiguo getChildren() pertenece a la interfaz RecursiveIterator que implementa SimpleXMLElement. En el código cotidiano se llama directamente a children(); esta página cubre ese método.

Qué devuelve SimpleXMLElement::children()

children() devuelve un SimpleXMLElement que se puede iterar con foreach para acceder a los hijos directos del nodo actual — no recurre automáticamente en los nietos. Acepta un argumento opcional $namespace para limitar el resultado a un espacio de nombres XML concreto, lo cual es esencial cuando un documento mezcla vocabularios (por ejemplo, RSS junto con Dublin Core).

Sintaxis

public function children(?string $namespace = null, bool $isPrefix = false): ?SimpleXMLElement
  • $namespace — un URI de espacio de nombres (o, cuando $isPrefix es true, un prefijo de espacio de nombres). Cuando es null (valor predeterminado), se devuelven los hijos del contexto de espacio de nombres actual.
  • $isPrefix — se establece en true si se pasa un prefijo (como "bk") en lugar del URI completo.

Nota sobre los espacios de nombres predeterminados: cuando XML usa un espacio de nombres predeterminado (declarado con xmlns="..." y sin prefijo), se debe pasar ese URI de espacio de nombres a children() para acceder a los elementos dentro de él. Llamar a children(null) en dicho nodo no devuelve nada.

Recorrido básico

El siguiente ejemplo carga XML desde una cadena con simplexml_load_string() para ejecutarse sin un archivo externo y luego recorre el árbol con llamadas anidadas a children(). getName() devuelve el nombre de etiqueta de cada elemento:

<?php

$data = <<<XML
<?xml version="1.0"?>
<library>
  <book>
    <title>The PHP Way</title>
    <author>Ada Byte</author>
  </book>
  <book>
    <title>XML in Depth</title>
    <author>Lee Markup</author>
  </book>
</library>
XML;

$xml = simplexml_load_string($data);

foreach ($xml->children() as $book) {
    echo $book->getName() . ":\n";          // "book"
    foreach ($book->children() as $field) {
        echo "  " . $field->getName() . " = " . $field . "\n";
    }
}

Salida:

book:
  title = The PHP Way
  author = Ada Byte
book:
  title = XML in Depth
  author = Lee Markup

El bucle externo visita cada <book>; el bucle interno visita sus hijos directos (<title>, <author>). Convertir un hijo a string (aquí mediante concatenación) devuelve su contenido de texto.

Filtrado por espacio de nombres

Cuando un documento declara espacios de nombres, se pasa el URI a children() para seleccionar únicamente los elementos que coincidan. getNamespaces(true) devuelve todos los espacios de nombres del documento indexados por prefijo, lo que permite buscar el URI de forma dinámica:

<?php

$data = <<<XML
<?xml version="1.0"?>
<catalog xmlns:bk="http://example.com/books">
  <bk:book>
    <bk:title>Namespaced PHP</bk:title>
  </bk:book>
  <bk:book>
    <bk:title>Beyond SimpleXML</bk:title>
  </bk:book>
</catalog>
XML;

$xml = simplexml_load_string($data);
$ns  = $xml->getNamespaces(true);            // ['bk' => 'http://example.com/books']

foreach ($xml->children($ns['bk']) as $book) {
    echo $book->children($ns['bk'])->title . "\n";
}

Salida:

Namespaced PHP
Beyond SimpleXML

Como cada <bk:book> y su <bk:title> pertenecen al espacio de nombres bk, se debe pasar ese URI en cada nivel para acceder a ellos.

Errores comunes

  • No es recursivo. children() solo expone los hijos directos. Para recorrer un árbol completo, llámalo de nuevo dentro del bucle (como se muestra arriba) o utiliza una consulta XPath.
  • La ausencia del filtro de espacio de nombres no devuelve nada. Si un bucle está silenciosamente vacío en XML con espacios de nombres, probablemente se olvidó pasar el URI del espacio de nombres.
  • Texto frente a elementos. Convierte un elemento a (string) y aplica trim() cuando solo se necesita su contenido de texto, especialmente con nodos de contenido mixto.
  • Valida siempre la entrada. Al cargar desde un archivo o URL, comprueba si el resultado es false y activa el manejo de errores de libxml antes de confiar en el resultado.

Conclusión

SimpleXMLElement::children() es la forma estándar de iterar los elementos hijo directos de un nodo XML en PHP. Combinándolo con getName() para los nombres de etiqueta, URIs de espacio de nombres para filtrar y conversión a string para el contenido de texto, se puede navegar por documentos anidados de forma limpia. Para un contexto más amplio, consulta la descripción general de PHP SimpleXML y el método relacionado attributes() para leer atributos de elementos.

Práctica

Práctica
¿Para qué sirve la función getChildren() en PHP?
¿Para qué sirve la función getChildren() en PHP?
Was this page helpful?