W3docs

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
ParametroDescrizione
$namespaceOpzionale. Un namespace XML con cui filtrare i figli. Se omesso, vengono restituiti i figli nel namespace predefinito del documento.
$isPrefixOpzionale. 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 nuovo children() su un figlio oppure usa XPath.

Iterare sui figli

L'uso più comune è scorrere ogni figlio diretto di un nodo:

php— editable, runs on the server

Output:

PHP Basics - John Doe
Mastering XML - Jane Roe

Qui $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: Tea

Lavorare 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 prefix

Si 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; usa attributes() 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.

Esercizio

Pratica
Cosa restituisce SimpleXMLElement::children()?
Cosa restituisce SimpleXMLElement::children()?
Was this page helpful?