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'interfacciaRecursiveIteratorimplementata daSimpleXMLElement. Nel codice di tutti i giorni si chiama direttamentechildren(); 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 atruese 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 achildren()per raggiungere gli elementi al suo interno. Chiamarechildren(null)su un tale nodo non restituisce nulla.
Navigazione di base
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 MarkupIl 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 SimpleXMLPoiché 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 queryXPath. - 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 applicaretrim()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
falsee 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.