children()
Apprenez comment PHP SimpleXMLElement::children() retourne les éléments enfants directs d'un nœud XML, avec le filtrage par espace de noms via $ns et $is_prefix.
Introduction
SimpleXMLElement::children() retourne les éléments enfants directs d'un nœud XML sous forme d'un nouvel objet SimpleXMLElement. Cette méthode fait partie de l'extension SimpleXML de PHP, la solution légère et orientée objet pour lire et parcourir du XML. On fait appel à children() chaque fois que l'on a besoin de parcourir en boucle ou de compter les éléments directement imbriqués dans un nœud — plutôt que d'y accéder un par un via leur nom de propriété.
Cette page couvre la signature de la méthode et sa valeur de retour, comment itérer sur les enfants, comment les compter, et ce que la plupart des tutoriels négligent : la lecture des enfants situés dans un espace de noms XML.
Syntaxe
public SimpleXMLElement::children(?string $namespace = null, bool $isPrefix = false): ?SimpleXMLElement| Paramètre | Description |
|---|---|
$namespace | Optionnel. Un espace de noms XML pour filtrer les enfants. Lorsqu'il est omis, les enfants dans l'espace de noms par défaut du document sont retournés. |
$isPrefix | Optionnel. Si true, $namespace est traité comme un préfixe d'espace de noms (ex. lib) ; si false (par défaut), il est traité comme un URI d'espace de noms (ex. http://example.com/lib). |
Valeur de retour : un objet SimpleXMLElement que vous pouvez parcourir avec foreach, indexer comme un array ($children[0]) ou passer à count(). La méthode retourne null uniquement si elle est appelée sur quelque chose qui n'est pas un élément valide.
children()retourne uniquement les enfants directs — elle ne descend pas jusqu'aux petits-enfants. Pour atteindre des nœuds plus profonds, appelezchildren()à nouveau sur un enfant, ou utilisez XPath.
Itérer sur les enfants
L'utilisation la plus courante est de parcourir en boucle chaque enfant direct d'un nœud :
Sortie :
PHP Basics - John Doe
Mastering XML - Jane RoeIci $xml représente la racine <books>, et children() retourne chaque <book>. À l'intérieur de la boucle, $book->title et $book->author lisent les valeurs des petits-enfants. Comme les deux éléments <book> partagent le même nom de balise, la boucle est la façon naturelle de gérer une structure répétée.
Compter les enfants
L'objet retourné fonctionne avec count(), ce qui permet de vérifier le nombre d'enfants directs d'un nœud et de les indexer comme 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";Sortie :
Number of items: 3
First item: TeaTravailler avec les espaces de noms
C'est là que children() justifie l'utilité de ses paramètres. Lorsqu'un document utilise des espaces de noms XML, un appel simple à children() ne retourne que les éléments dans l'espace de noms par défaut — les éléments préfixés sont ignorés. Pour les atteindre, il faut passer l'espace de noms.
<?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";Sortie :
1 default-namespace child(ren)
1 lib child(ren): Namespaced Book
1 child(ren) by prefixNotez que le simple children() ne trouve que <note>, tandis que children('http://example.com/lib') trouve l'élément <lib:book>. Si vous oubliez cela, les données avec espace de noms semblent « disparaître » — un piège classique de SimpleXML.
Pièges courants
- Seuls les enfants directs sont retournés. Les petits-enfants nécessitent un autre appel à
children()ou l'utilisation de XPath. - Les enfants avec espace de noms nécessitent l'argument d'espace de noms. Un simple
children()ignore silencieusement les éléments préfixés. - Les valeurs sont des objets, pas des string. Castez un nœud feuille en string (
(string) $child) ou concaténez-le avant de le traiter comme du texte. - Les attributs sont séparés.
children()retourne les éléments imbriqués ; utilisezattributes()pour lire les attributs d'un élément.
Conclusion
SimpleXMLElement::children() est la méthode standard pour énumérer les éléments enfants directs d'un nœud XML en PHP, que vous parcouriez avec foreach, comptiez avec count(), ou exploriez un espace de noms spécifique via les paramètres $namespace et $isPrefix. Combinez-la avec attributes() et simplexml_load_string() pour analyser du XML réel de manière propre.