getNamespaces()
Découvrez comment getNamespaces() de PHP retourne les espaces de noms actifs d'un élément XML, avec syntaxe, exemple et différences avec getDocNamespaces().
Introduction
SimpleXML est une extension PHP qui fournit une API orientée objet simple pour lire des documents XML. Lorsqu'un document XML utilise des espaces de noms — par exemple <bk:title> où bk est lié à un URI — vous avez souvent besoin de savoir quels espaces de noms un élément donné déclare ou hérite. La méthode SimpleXMLElement::getNamespaces() répond exactement à cette question : elle retourne les espaces de noms qui sont en scope pour un élément. Cet article explique sa syntaxe, présente un exemple exécutable et précise comment elle se distingue de la méthode étroitement liée getDocNamespaces().
Comprendre la fonction SimpleXMLElement::getNamespaces()
getNamespaces() retourne un array associatif des espaces de noms utilisés dans un élément — c'est-à-dire les préfixes (et l'espace de noms par défaut, indexé par une chaîne vide) qui s'appliquent réellement au nœud et, éventuellement, à ses descendants. La syntaxe suit le format officiel du manuel PHP :
SimpleXMLElement::getNamespaces ( bool $recursive = false ) : arrayIci, $recursive est facultatif. Laissé à sa valeur par défaut false, la méthode ne rapporte que les espaces de noms utilisés sur l'élément courant. Défini à true, elle parcourt également les enfants de l'élément et inclut tous les espaces de noms qu'ils utilisent. L'array retourné associe chaque préfixe à son URI d'espace de noms.
Il est utile de distinguer deux méthodes similaires :
getNamespaces()retourne les espaces de noms qui sont réellement utilisés par l'élément (et éventuellement ses enfants).getDocNamespaces()retourne tous les espaces de noms déclarés dans le document, qu'ils soient utilisés ou non.
Exemple d'utilisation
Voyons un exemple pour comprendre comment SimpleXMLElement::getNamespaces() fonctionne en PHP :
Dans l'exemple ci-dessus, nous créons un SimpleXMLElement à partir d'un élément <book> dont l'enfant <bk:title> utilise l'espace de noms bk lié à https://example.com/books. En passant true à getNamespaces(), on demande à la méthode de parcourir récursivement les enfants, de sorte que l'espace de noms bk utilisé par <bk:title> est inclus. Nous itérons ensuite sur l'array retourné et affichons chaque préfixe avec son URI. Le résultat est :
Prefix: bk, URI: https://example.com/booksSi nous avions appelé getNamespaces(false) à la place, l'array serait vide ici, car l'élément racine <book> lui-même n'utilise pas le préfixe bk — seul son enfant l'utilise.
Conclusion
La méthode SimpleXMLElement::getNamespaces() est un outil ciblé pour découvrir quels espaces de noms sont réellement en scope pour un élément. Utilisez-la (avec $recursive = true) lorsque vous souhaitez connaître les espaces de noms utilisés par un élément et ses enfants, et recourez à getDocNamespaces() lorsque vous avez besoin de tous les espaces de noms déclarés dans le document. Pour apprendre à interroger des nœuds avec espaces de noms une fois leurs préfixes connus, consultez registerXPathNamespace().