getchildren()
SimpleXML est une extension PHP offrant une API simple pour travailler avec des documents XML. SimpleXMLElement::children() récupère les éléments enfants immédiats d'un nœud.
SimpleXMLElement::children()
SimpleXML est une extension PHP qui fournit une API simple pour analyser et manipuler des documents XML. Parmi ses méthodes, SimpleXMLElement::children() vous permet de récupérer les éléments enfants immédiats d'un nœud sous forme d'objets SimpleXMLElement afin de les parcourir en boucle. Ce guide explique ce que retourne la méthode, comment elle gère les espaces de noms et comment l'utiliser sur des documents réels.
L'ancien alias
getChildren()appartient à l'interfaceRecursiveIteratorqu'implémenteSimpleXMLElement. Dans le code courant, vous appelez directementchildren(); cette page traite de cette méthode.
Ce que retourne SimpleXMLElement::children()
children() retourne un SimpleXMLElement que vous pouvez itérer avec foreach pour accéder aux enfants directs du nœud courant — elle ne récurse pas automatiquement dans les petits-enfants. Elle accepte un argument optionnel $namespace pour limiter le résultat à un espace de noms XML, ce qui est essentiel lorsqu'un document mélange plusieurs vocabulaires (par exemple RSS et Dublin Core).
Syntaxe
public function children(?string $namespace = null, bool $isPrefix = false): ?SimpleXMLElement$namespace— un URI d'espace de noms (ou, quand$isPrefixvauttrue, un préfixe d'espace de noms). Quand la valeur estnull(par défaut), les enfants du contexte d'espace de noms courant sont retournés.$isPrefix— à passer àtruesi vous fournissez un préfixe (comme"bk") plutôt que l'URI complète.
Remarque sur les espaces de noms par défaut : Lorsque XML utilise un espace de noms par défaut (déclaré avec
xmlns="..."sans préfixe), vous devez passer cet URI d'espace de noms àchildren()pour atteindre les éléments qu'il contient. Appelerchildren(null)sur un tel nœud ne retourne rien.
Parcours basique
L'exemple ci-dessous charge du XML depuis une string avec simplexml_load_string() pour s'exécuter sans fichier externe, puis parcourt l'arbre avec des appels children() imbriqués. getName() retourne le nom de balise de chaque élément :
<?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";
}
}Résultat :
book:
title = The PHP Way
author = Ada Byte
book:
title = XML in Depth
author = Lee MarkupLa boucle externe visite chaque <book> ; la boucle interne visite ses enfants directs (<title>, <author>). Caster un enfant en string (ici par concaténation) retourne son contenu textuel.
Filtrage par espace de noms
Lorsqu'un document déclare des espaces de noms, passez l'URI à children() pour ne sélectionner que les éléments correspondants. getNamespaces(true) retourne tous les espaces de noms du document indexés par préfixe, vous pouvez donc rechercher l'URI dynamiquement :
<?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";
}Résultat :
Namespaced PHP
Beyond SimpleXMLComme chaque <bk:book> et son <bk:title> appartiennent à l'espace de noms bk, vous devez passer cet URI à chaque niveau pour les atteindre.
Pièges courants
- La méthode n'est pas récursive.
children()n'expose que les enfants directs. Pour parcourir un arbre entier, appelez-la à nouveau dans la boucle (comme illustré ci-dessus) ou utilisez une requêteXPath. - Un filtre d'espace de noms manquant ne retourne rien. Si une boucle est silencieusement vide sur du XML avec espaces de noms, vous avez probablement oublié de passer l'URI de l'espace de noms.
- Texte vs. éléments. Castez un élément en
(string)et appliqueztrim()lorsque vous ne souhaitez que son contenu textuel, surtout avec des nœuds à contenu mixte. - Validez toujours les entrées. Lors du chargement depuis un fichier ou une URL, vérifiez que le résultat n'est pas
falseet activez la gestion des erreurs libxml avant de faire confiance au résultat.
Conclusion
SimpleXMLElement::children() est la méthode standard pour itérer les éléments enfants directs d'un nœud XML en PHP. En la combinant avec getName() pour les noms de balises, les URI d'espaces de noms pour le filtrage et le cast en string pour le contenu textuel, vous pouvez naviguer dans des documents imbriqués de façon claire. Pour un contexte plus large, consultez la vue d'ensemble de PHP SimpleXML et la méthode connexe attributes() pour lire les attributs d'éléments.