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 interfazRecursiveIteratorque implementaSimpleXMLElement. En el código cotidiano se llama directamente achildren(); 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$isPrefixestrue, un prefijo de espacio de nombres). Cuando esnull(valor predeterminado), se devuelven los hijos del contexto de espacio de nombres actual.$isPrefix— se establece entruesi 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 achildren()para acceder a los elementos dentro de él. Llamar achildren(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 MarkupEl 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 SimpleXMLComo 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 consultaXPath. - 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 aplicatrim()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
falsey 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.