getNamespaces()
Aprenda como getNamespaces() do PHP retorna os namespaces em escopo para um elemento XML, com sintaxe, exemplo e diferenças de getDocNamespaces().
Introdução
SimpleXML é uma extensão do PHP que fornece uma API simples e orientada a objetos para leitura de documentos XML. Quando um documento XML utiliza namespaces — por exemplo, <bk:title> onde bk está vinculado a uma URI — muitas vezes é necessário saber quais namespaces um determinado elemento declara ou herda. O método SimpleXMLElement::getNamespaces() responde exatamente a essa questão: ele retorna os namespaces que estão em escopo para um elemento. Este artigo explica sua sintaxe, apresenta um exemplo executável e esclarece como ele difere do relacionado getDocNamespaces().
Entendendo a função SimpleXMLElement::getNamespaces()
getNamespaces() retorna um array associativo dos namespaces usados em um elemento — ou seja, os prefixos (e o namespace padrão, indexado por uma string vazia) que realmente se aplicam ao nó e, opcionalmente, aos seus descendentes. A sintaxe segue o formato oficial do manual do PHP:
SimpleXMLElement::getNamespaces ( bool $recursive = false ) : arrayAqui, $recursive é opcional. Quando mantido no seu valor padrão false, o método reporta apenas os namespaces em uso no elemento atual. Quando definido como true, ele também percorre os filhos do elemento e inclui quaisquer namespaces que eles utilizem. O array retornado mapeia cada prefixo para sua URI de namespace.
Vale contrastar dois métodos semelhantes:
getNamespaces()retorna os namespaces que são realmente usados pelo elemento (e opcionalmente por seus filhos).getDocNamespaces()retorna todos os namespaces declarados no documento, sejam eles utilizados ou não.
Exemplo de Uso
Vamos analisar um exemplo para entender como SimpleXMLElement::getNamespaces() funciona em PHP:
No exemplo acima, criamos um SimpleXMLElement a partir de um elemento <book> cujo filho <bk:title> usa o namespace bk vinculado a https://example.com/books. Passando true para getNamespaces(), o método percorre os filhos recursivamente, então o namespace bk usado por <bk:title> é incluído. Em seguida, iteramos sobre o array retornado e imprimimos cada prefixo junto com sua URI. A saída é:
Prefix: bk, URI: https://example.com/booksSe tivéssemos chamado getNamespaces(false) em vez disso, o array estaria vazio aqui, porque o elemento raiz <book> em si não usa o prefixo bk — apenas seu filho o usa.
Conclusão
O método SimpleXMLElement::getNamespaces() é uma ferramenta focada para descobrir quais namespaces estão realmente em escopo para um elemento. Use-o (com $recursive = true) quando quiser os namespaces dos quais um elemento e seus filhos dependem, e recorra ao getDocNamespaces() quando precisar de todos os namespaces declarados no documento. Para aprender como consultar nós com namespace depois de conhecer seus prefixos, veja registerXPathNamespace().