getNamespaces()
Aprende cómo getNamespaces() de PHP devuelve los espacios de nombres en alcance para un elemento XML, con sintaxis, ejemplo ejecutable y diferencias con getDocNamespaces().
Introducción
SimpleXML es una extensión de PHP que proporciona una API sencilla y orientada a objetos para leer documentos XML. Cuando un documento XML utiliza espacios de nombres — por ejemplo <bk:title> donde bk está vinculado a una URI — a menudo necesitas saber qué espacios de nombres declara o hereda un determinado elemento. El método SimpleXMLElement::getNamespaces() responde exactamente esa pregunta: devuelve los espacios de nombres que están en alcance para un elemento. Este artículo explica su sintaxis, muestra un ejemplo ejecutable y aclara cómo se diferencia del relacionado getDocNamespaces().
Entendiendo la función SimpleXMLElement::getNamespaces()
getNamespaces() devuelve un array asociativo de los espacios de nombres utilizados en un elemento — es decir, los prefijos (y el espacio de nombres predeterminado, indexado por una cadena vacía) que realmente se aplican al nodo y, opcionalmente, a sus descendientes. La sintaxis sigue el formato oficial del manual de PHP:
SimpleXMLElement::getNamespaces ( bool $recursive = false ) : arrayAquí, $recursive es opcional. Cuando se deja en su valor predeterminado false, el método reporta solo los espacios de nombres en uso en el elemento actual. Cuando se establece en true, también recorre los hijos del elemento e incluye cualquier espacio de nombres que estos utilicen. El array devuelto mapea cada prefijo a su URI de espacio de nombres.
Vale la pena contrastar dos métodos similares:
getNamespaces()devuelve los espacios de nombres que son realmente utilizados por el elemento (y opcionalmente sus hijos).getDocNamespaces()devuelve cada espacio de nombres declarado en el documento, esté o no en uso.
Ejemplo de uso
Veamos un ejemplo para entender cómo funciona SimpleXMLElement::getNamespaces() en PHP:
En el ejemplo anterior, creamos un SimpleXMLElement a partir de un elemento <book> cuyo hijo <bk:title> utiliza el espacio de nombres bk vinculado a https://example.com/books. Al pasar true a getNamespaces() el método recurre en los hijos, por lo que el espacio de nombres bk utilizado por <bk:title> queda incluido. Luego iteramos sobre el array devuelto e imprimimos cada prefijo junto con su URI. La salida es:
Prefix: bk, URI: https://example.com/booksSi hubiéramos llamado a getNamespaces(false) en su lugar, el array estaría vacío aquí, porque el elemento raíz <book> en sí mismo no utiliza el prefijo bk — solo lo hace su hijo.
Conclusión
El método SimpleXMLElement::getNamespaces() es una herramienta específica para descubrir qué espacios de nombres están realmente en alcance para un elemento. Úsalo (con $recursive = true) cuando quieras los espacios de nombres en los que un elemento y sus hijos se apoyan, y recurre a getDocNamespaces() cuando necesites todos los espacios de nombres declarados en el documento. Para aprender a consultar nodos con espacio de nombres una vez que conoces sus prefijos, consulta registerXPathNamespace().