children()
Scopri come SimpleXMLElement::children() restituisce gli elementi figlio diretti di un nodo XML, con filtraggio per namespace tramite $ns e $is_prefix.
Introduzione
SimpleXMLElement::children() restituisce gli elementi figlio diretti di un nodo XML come nuovo SimpleXMLElement. Fa parte dell'estensione SimpleXML di PHP, il metodo leggero e orientato agli oggetti per leggere e navigare XML. Si ricorre a children() ogni volta che occorre iterare o contare gli elementi direttamente annidati all'interno di un nodo, invece di accedervi tramite il nome della proprietà uno alla volta.
Questa pagina tratta la firma del metodo e il valore restituito, come iterare sui figli, come contarli e la parte che la maggior parte dei tutorial trascura: leggere gli elementi figlio che si trovano in un namespace XML.
Sintassi
public SimpleXMLElement::children(?string $namespace = null, bool $isPrefix = false): ?SimpleXMLElement| Parametro | Descrizione |
|---|---|
$namespace | Opzionale. Un namespace XML con cui filtrare i figli. Se omesso, vengono restituiti i figli nel namespace predefinito del documento. |
$isPrefix | Opzionale. Se true, $namespace viene trattato come prefisso di namespace (es. lib); se false (predefinito), viene trattato come URI di namespace (es. http://example.com/lib). |
Valore restituito: un SimpleXMLElement su cui è possibile iterare con foreach, indicizzare come un array ($children[0]) o passare a count(). Restituisce null solo se invocato su qualcosa che non è un elemento valido.
children()restituisce solo i figli diretti — non scende nei nipoti. Per raggiungere nodi più profondi, chiama di nuovochildren()su un figlio oppure usa XPath.
Iterare sui figli
L'uso più comune è scorrere ogni figlio diretto di un nodo:
Output:
PHP Basics - John Doe
Mastering XML - Jane RoeQui $xml è la radice <books> e children() restituisce ogni <book>. All'interno del ciclo, $book->title e $book->author leggono i valori dei nipoti. Poiché entrambi gli elementi <book> condividono lo stesso nome di tag, il ciclo è il modo naturale per gestire una struttura ripetuta.
Contare i figli
L'oggetto restituito funziona con count(), quindi è possibile verificare quanti figli diretti ha un nodo e indicizzarli come un array:
<?php
$xml = new SimpleXMLElement('<menu><item>Tea</item><item>Coffee</item><item>Juice</item></menu>');
$children = $xml->children();
echo "Number of items: ", count($children), "\n";
echo "First item: ", $children[0], "\n";Output:
Number of items: 3
First item: TeaLavorare con i namespace
È qui che children() giustifica i propri parametri. Quando un documento usa namespace XML, una chiamata semplice a children() restituisce solo gli elementi nel namespace predefinito — gli elementi con prefisso vengono ignorati. Per raggiungerli, è necessario passare il namespace.
<?php
$xml = new SimpleXMLElement(
'<library xmlns:lib="http://example.com/lib">
<lib:book>Namespaced Book</lib:book>
<note>Plain note</note>
</library>'
);
// No namespace: only children in the default namespace
echo count($xml->children()), " default-namespace child(ren)\n";
// Pass the namespace URI to reach the lib: children
$libChildren = $xml->children('http://example.com/lib');
echo count($libChildren), " lib child(ren): ", trim((string) $libChildren->book), "\n";
// Or pass the prefix with $isPrefix = true
$byPrefix = $xml->children('lib', true);
echo count($byPrefix), " child(ren) by prefix\n";Output:
1 default-namespace child(ren)
1 lib child(ren): Namespaced Book
1 child(ren) by prefixSi noti che la semplice chiamata children() trova solo <note>, mentre children('http://example.com/lib') trova l'elemento <lib:book>. Se lo si dimentica, i dati con namespace sembrano "sparire" — un classico errore con SimpleXML.
Errori comuni
- Vengono restituiti solo i figli diretti. Per i nipoti occorre un'altra chiamata a
children()o a XPath. - I figli con namespace richiedono l'argomento namespace. Una semplice chiamata a
children()ignora silenziosamente gli elementi con prefisso. - I valori sono object, non string. Converti un nodo foglia in stringa (
(string) $child) o concatenalo prima di trattarlo come testo. - Gli attributi sono separati.
children()restituisce elementi annidati; usaattributes()per leggere gli attributi di un elemento.
Conclusione
SimpleXMLElement::children() è il metodo standard per enumerare gli elementi figlio diretti di un nodo XML in PHP, sia che si stia iterando con foreach, contando con count(), o accedendo a uno specifico namespace tramite i parametri $namespace e $isPrefix. Combinalo con attributes() e simplexml_load_string() per analizzare XML reale in modo pulito.