W3docs

children()

Aprende cómo SimpleXMLElement::children() de PHP devuelve los elementos hijos directos de un nodo XML, con filtrado de namespaces mediante $ns e $is_prefix.

Introducción

SimpleXMLElement::children() devuelve los elementos hijos directos de un nodo XML como un nuevo SimpleXMLElement. Forma parte de la extensión SimpleXML de PHP, la forma ligera y orientada a objetos de leer y recorrer XML. Se utiliza children() cuando necesitas iterar o contar los elementos directamente anidados dentro de un nodo, en lugar de acceder a ellos por nombre de propiedad uno a uno.

Esta página cubre la firma del método y su valor de retorno, cómo iterar los hijos, cómo contarlos, y la parte que la mayoría de tutoriales omite: leer hijos que se encuentran en un espacio de nombres XML.

Sintaxis

public SimpleXMLElement::children(?string $namespace = null, bool $isPrefix = false): ?SimpleXMLElement
ParámetroDescripción
$namespaceOpcional. Un espacio de nombres XML para filtrar los hijos. Si se omite, se devuelven los hijos del espacio de nombres predeterminado del documento.
$isPrefixOpcional. Si es true, $namespace se trata como un prefijo de espacio de nombres (p. ej., lib); si es false (valor predeterminado), se trata como un URI de espacio de nombres (p. ej., http://example.com/lib).

Valor de retorno: un SimpleXMLElement que puedes iterar con foreach, indexar como un array ($children[0]), o pasar a count(). Devuelve null solo cuando se llama sobre algo que no es un elemento válido.

children() devuelve únicamente los hijos directos — no desciende hacia los nietos. Para acceder a nodos más profundos, llama a children() de nuevo sobre un hijo, o utiliza XPath.

Iterando sobre los hijos

El uso más común es recorrer cada hijo directo de un nodo:

php— editable, runs on the server

Salida:

PHP Basics - John Doe
Mastering XML - Jane Roe

Aquí $xml es la raíz <books>, y children() produce cada <book>. Dentro del bucle, $book->title y $book->author leen los valores de los elementos nietos. Como ambos elementos <book> comparten el mismo nombre de etiqueta, el bucle es la forma natural de manejar una estructura repetida.

Contando hijos

El objeto devuelto funciona con count(), de modo que puedes comprobar cuántos hijos directos tiene un nodo e indexarlos como un array:

<?php
$xml = new SimpleXMLElement('<menu><item>Tea</item><item>Coffee</item><item>Juice</item></menu>');
$children = $xml->children();

echo "Number of items: ", count($children), "\n";
echo "First item: ", $children[0], "\n";

Salida:

Number of items: 3
First item: Tea

Trabajando con espacios de nombres

Aquí es donde children() justifica sus parámetros. Cuando un documento utiliza espacios de nombres XML, una llamada simple a children() solo devuelve los elementos del espacio de nombres predeterminado — los elementos con prefijo se ignoran. Para acceder a ellos, debes pasar el espacio de nombres.

<?php
$xml = new SimpleXMLElement(
    '<library xmlns:lib="http://example.com/lib">
        <lib:book>Namespaced Book</lib:book>
        <note>Plain note</note>
    </library>'
);

// No namespace: only children in the default namespace
echo count($xml->children()), " default-namespace child(ren)\n";

// Pass the namespace URI to reach the lib: children
$libChildren = $xml->children('http://example.com/lib');
echo count($libChildren), " lib child(ren): ", trim((string) $libChildren->book), "\n";

// Or pass the prefix with $isPrefix = true
$byPrefix = $xml->children('lib', true);
echo count($byPrefix), " child(ren) by prefix\n";

Salida:

1 default-namespace child(ren)
1 lib child(ren): Namespaced Book
1 child(ren) by prefix

Observa que el children() sin argumentos encuentra solo <note>, mientras que children('http://example.com/lib') encuentra el elemento <lib:book>. Si olvidas esto, los datos con espacio de nombres parecen "desaparecer" — un error clásico de SimpleXML.

Errores comunes

  • Solo se devuelven los hijos directos. Los nietos requieren otra llamada a children() o XPath.
  • Los hijos con espacio de nombres necesitan el argumento de espacio de nombres. Un children() simple ignora silenciosamente los elementos con prefijo.
  • Los valores son objetos, no strings. Convierte un nodo hoja a string ((string) $child) o concaténalo antes de tratarlo como texto.
  • Los atributos son independientes. children() devuelve elementos anidados; usa attributes() para leer los atributos de un elemento.

Conclusión

SimpleXMLElement::children() es la forma estándar de enumerar los elementos hijos directos de un nodo XML en PHP, ya sea que estés iterando con foreach, contando con count(), o accediendo a un espacio de nombres específico mediante los parámetros $namespace e $isPrefix. Combínalo con attributes() y simplexml_load_string() para analizar XML del mundo real de forma limpia.

Práctica

Práctica
¿Qué devuelve SimpleXMLElement::children()?
¿Qué devuelve SimpleXMLElement::children()?
Was this page helpful?