getchildren()
SimpleXML é uma extensão PHP que fornece uma API simples para trabalhar com documentos XML. A função SimpleXMLElement::children() permite iterar elementos filhos.
SimpleXMLElement::children()
SimpleXML é uma extensão PHP que fornece uma API direta para analisar e manipular documentos XML. Entre seus métodos, SimpleXMLElement::children() permite recuperar os elementos filhos imediatos de um nó como objetos SimpleXMLElement para que você possa iterá-los. Este guia explica o que o método retorna, como ele lida com namespaces e como usá-lo em documentos reais.
O alias antigo
getChildren()pertence à interfaceRecursiveIteratorqueSimpleXMLElementimplementa. No código do dia a dia, você chamachildren()diretamente; esta página cobre esse método.
O que SimpleXMLElement::children() retorna
children() retorna um SimpleXMLElement que você pode iterar com foreach para acessar os filhos diretos do nó atual — ele não percorre os netos automaticamente. Aceita um argumento opcional $namespace para limitar o resultado a um namespace XML específico, o que é essencial quando um documento mistura vocabulários (por exemplo, RSS mais Dublin Core).
Sintaxe
public function children(?string $namespace = null, bool $isPrefix = false): ?SimpleXMLElement$namespace— um URI de namespace (ou, quando$isPrefixétrue, um prefixo de namespace). Quandonull(o padrão), os filhos do contexto de namespace atual são retornados.$isPrefix— defina comotruese você passar um prefixo (como"bk") em vez do URI completo.
Nota sobre namespaces padrão: Quando o XML usa um namespace padrão (declarado com
xmlns="..."e sem prefixo), você deve passar esse URI de namespace parachildren()para acessar os elementos dentro dele. Chamarchildren(null)em tal nó não retorna nada.
Travessia básica
O exemplo abaixo carrega XML de uma string com simplexml_load_string() para que funcione sem um arquivo externo, depois percorre a árvore com chamadas aninhadas de children(). getName() retorna o nome de tag de cada elemento:
<?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";
}
}Saída:
book:
title = The PHP Way
author = Ada Byte
book:
title = XML in Depth
author = Lee MarkupO loop externo visita cada <book>; o loop interno visita seus filhos diretos (<title>, <author>). Converter um filho para string (aqui via concatenação) retorna seu conteúdo de texto.
Filtrando por namespace
Quando um documento declara namespaces, passe o URI para children() para selecionar apenas os elementos correspondentes. getNamespaces(true) retorna todos os namespaces do documento indexados por prefixo, para que você possa buscar o URI dinamicamente:
<?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";
}Saída:
Namespaced PHP
Beyond SimpleXMLComo cada <bk:book> e seu <bk:title> pertencem ao namespace bk, você deve passar esse URI em cada nível para acessá-los.
Armadilhas comuns
- Não é recursivo.
children()expõe apenas os filhos diretos. Para percorrer uma árvore inteira, chame-o novamente dentro do loop (conforme mostrado acima) ou use uma consultaXPath. - Filtro de namespace ausente não retorna nada. Se um loop estiver silenciosamente vazio em XML com namespace, você provavelmente esqueceu de passar o URI do namespace.
- Texto vs. elementos. Converta um elemento para
(string)e apliquetrim()quando quiser apenas seu conteúdo de texto, especialmente em nós com conteúdo misto. - Sempre valide a entrada. Ao carregar de um arquivo ou URL, verifique se há
falsee habilite o tratamento de erros do libxml antes de confiar no resultado.
Conclusão
SimpleXMLElement::children() é a maneira padrão de iterar os elementos filhos diretos de um nó XML em PHP. Combinando-o com getName() para nomes de tags, URIs de namespace para filtragem e conversão para string para conteúdo de texto, você pode navegar em documentos aninhados de forma limpa. Para um contexto mais amplo, consulte a visão geral do PHP SimpleXML e o método relacionado attributes() para leitura de atributos de elementos.