W3docs

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 à interface RecursiveIterator que SimpleXMLElement implementa. No código do dia a dia, você chama children() 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). Quando null (o padrão), os filhos do contexto de namespace atual são retornados.
  • $isPrefix — defina como true se 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 para children() para acessar os elementos dentro dele. Chamar children(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 Markup

O 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 SimpleXML

Como 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 consulta XPath.
  • 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 aplique trim() 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á false e 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.

Prática

Prática
Qual é o uso da função getChildren() em PHP?
Qual é o uso da função getChildren() em PHP?
Was this page helpful?