W3docs

getchildren()

SimpleXML è un'estensione PHP che fornisce un'API semplice per lavorare con i documenti XML. La funzione SimpleXMLElement::getChildren() è una di esse.

SimpleXMLElement::children()

SimpleXML è un'estensione PHP che fornisce un'API diretta per analizzare e manipolare documenti XML. Tra i suoi metodi, SimpleXMLElement::children() consente di recuperare gli elementi figli immediati di un nodo come oggetti SimpleXMLElement, in modo da poterli scorrere in un ciclo. Questa guida spiega cosa restituisce il metodo, come gestisce i namespace e come utilizzarlo su documenti reali.

Il vecchio alias getChildren() appartiene all'interfaccia RecursiveIterator implementata da SimpleXMLElement. Nel codice di tutti i giorni si chiama direttamente children(); questa pagina tratta quel metodo.

Cosa restituisce SimpleXMLElement::children()

children() restituisce un SimpleXMLElement che è possibile iterare con foreach per accedere ai figli diretti del nodo corrente — non ricorre automaticamente nei nipoti. Accetta un argomento opzionale $namespace per limitare il risultato a un unico namespace XML, essenziale quando un documento mescola vocabolari diversi (ad esempio RSS insieme a Dublin Core).

Sintassi

public function children(?string $namespace = null, bool $isPrefix = false): ?SimpleXMLElement
  • $namespace — un URI di namespace (o, quando $isPrefix è true, un prefisso di namespace). Quando è null (il valore predefinito), vengono restituiti i figli del contesto di namespace corrente.
  • $isPrefix — impostare a true se si passa un prefisso (come "bk") invece dell'URI completo.

Nota sui namespace predefiniti: quando XML utilizza un namespace predefinito (dichiarato con xmlns="..." senza prefisso), è necessario passare quell'URI di namespace a children() per raggiungere gli elementi al suo interno. Chiamare children(null) su un tale nodo non restituisce nulla.

L'esempio seguente carica XML da una stringa con simplexml_load_string() in modo da funzionare senza file esterni, poi scorre l'albero con chiamate annidate a children(). getName() restituisce il nome del tag di ciascun 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";
    }
}

Output:

book:
  title = The PHP Way
  author = Ada Byte
book:
  title = XML in Depth
  author = Lee Markup

Il ciclo esterno visita ciascun <book>; il ciclo interno visita i suoi figli diretti (<title>, <author>). Convertire un figlio in string (qui tramite concatenazione) restituisce il suo contenuto testuale.

Filtrare per namespace

Quando un documento dichiara namespace, passare l'URI a children() per selezionare solo gli elementi corrispondenti. getNamespaces(true) restituisce tutti i namespace del documento indicizzati per prefisso, così è possibile cercare l'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";
}

Output:

Namespaced PHP
Beyond SimpleXML

Poiché ogni <bk:book> e il suo <bk:title> si trovano nel namespace bk, è necessario passare quell'URI ad ogni livello per raggiungerli.

Errori comuni

  • Non è ricorsivo. children() espone solo i figli diretti. Per attraversare un intero albero, chiamarlo di nuovo all'interno del ciclo (come mostrato sopra) oppure usare una query XPath.
  • Senza filtro per namespace non viene restituito nulla. Se un ciclo risulta silenziosamente vuoto su XML con namespace, probabilmente si è dimenticato di passare l'URI del namespace.
  • Testo vs. elementi. Convertire un elemento in (string) e applicare trim() quando si vuole solo il suo contenuto testuale, specialmente con nodi a contenuto misto.
  • Validare sempre l'input. Quando si carica da un file o URL, verificare la presenza di false e abilitare la gestione degli errori libxml prima di fidarsi del risultato.

Conclusione

SimpleXMLElement::children() è il modo standard per iterare gli elementi figli diretti di un nodo XML in PHP. Combinandolo con getName() per i nomi dei tag, gli URI di namespace per il filtraggio e il casting a string per il contenuto testuale, è possibile navigare documenti annidati in modo pulito. Per un contesto più ampio, vedere la panoramica PHP SimpleXML e il metodo correlato attributes() per la lettura degli attributi degli elementi.

Pratica

Pratica
Qual è l'uso della funzione getChildren() in PHP?
Qual è l'uso della funzione getChildren() in PHP?
Was this page helpful?