children()
Erfahren Sie, wie PHP's SimpleXMLElement::children() direkte Kindelemente eines XML-Knotens zurückgibt, mit Namespace-Filterung über $ns und $is_prefix.
Einführung
SimpleXMLElement::children() gibt die direkten Kindelemente eines XML-Knotens als neues SimpleXMLElement zurück. Es ist Teil von PHP's SimpleXML-Erweiterung, dem leichtgewichtigen, objektorientierten Weg zum Lesen und Durchlaufen von XML. Sie verwenden children() immer dann, wenn Sie die direkt in einem Knoten verschachtelten Elemente durchlaufen oder zählen müssen — anstatt auf sie einzeln über den Property-Namen zuzugreifen.
Diese Seite behandelt die Signatur und den Rückgabewert der Methode, wie man Kindelemente iteriert, wie man sie zählt, und den Teil, den die meisten Tutorials überspringen: das Lesen von Kindelementen, die sich in einem XML-Namespace befinden.
Syntax
public SimpleXMLElement::children(?string $namespace = null, bool $isPrefix = false): ?SimpleXMLElement| Parameter | Beschreibung |
|---|---|
$namespace | Optional. Ein XML-Namespace, nach dem Kindelemente gefiltert werden sollen. Wenn weggelassen, werden Kindelemente im Standard-Namespace des Dokuments zurückgegeben. |
$isPrefix | Optional. Wenn true, wird $namespace als Namespace-Präfix behandelt (z. B. lib); wenn false (Standard), wird es als Namespace-URI behandelt (z. B. http://example.com/lib). |
Rückgabewert: ein SimpleXMLElement, über das Sie mit foreach iterieren, es wie ein array indizieren ($children[0]) oder an count() übergeben können. Es gibt nur null zurück, wenn es auf etwas aufgerufen wird, das kein gültiges Element ist.
children()gibt nur direkte Kindelemente zurück — es steigt nicht in Enkelkinder hinab. Um tiefer liegende Knoten zu erreichen, rufen Siechildren()erneut auf einem Kindelement auf oder verwenden Sie XPath.
Über Kindelemente iterieren
Die häufigste Verwendung ist das Durchlaufen aller direkten Kindelemente eines Knotens:
Ausgabe:
PHP Basics - John Doe
Mastering XML - Jane RoeHier ist $xml der <books>-Wurzelknoten, und children() liefert jedes <book>. Innerhalb der Schleife lesen $book->title und $book->author die Enkelkindwerte aus. Da beide <book>-Elemente denselben Tag-Namen teilen, ist das Durchlaufen der natürliche Weg, um eine wiederholte Struktur zu verarbeiten.
Kindelemente zählen
Das zurückgegebene object funktioniert mit count(), sodass Sie prüfen können, wie viele direkte Kindelemente ein Knoten hat, und auf sie wie ein array indizieren können:
<?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";Ausgabe:
Number of items: 3
First item: TeaMit Namespaces arbeiten
Hier kommen die Parameter von children() zum Tragen. Wenn ein Dokument XML-Namespaces verwendet, gibt ein einfacher children()-Aufruf nur Elemente im Standard-Namespace zurück — Elemente mit Präfix werden übersprungen. Um sie zu erreichen, übergeben Sie den 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";Ausgabe:
1 default-namespace child(ren)
1 lib child(ren): Namespaced Book
1 child(ren) by prefixBeachten Sie: das bloße children() findet nur <note>, während children('http://example.com/lib') das <lib:book>-Element findet. Wenn Sie dies vergessen, scheinen Namespace-Daten zu „verschwinden" — ein klassischer SimpleXML-Fallstrick.
Häufige Fallstricke
- Es werden nur direkte Kindelemente zurückgegeben. Enkelkinder erfordern einen weiteren
children()-Aufruf oder XPath. - Kindelemente mit Namespace benötigen das Namespace-Argument. Ein einfaches
children()ignoriert Elemente mit Präfix stillschweigend. - Werte sind Objekte, keine Strings. Wandeln Sie einen Blattknoten in einen string um (
(string) $child) oder verketten Sie ihn, bevor Sie ihn als Text behandeln. - Attribute sind getrennt.
children()gibt verschachtelte Elemente zurück; verwenden Sieattributes(), um die Attribute eines Elements zu lesen.
Fazit
SimpleXMLElement::children() ist der Standardweg, um die direkten Kindelemente eines XML-Knotens in PHP aufzuzählen — ob Sie mit foreach iterieren, mit count() zählen oder über die Parameter $namespace und $isPrefix in einen bestimmten Namespace einsteigen. Kombinieren Sie es mit attributes() und simplexml_load_string(), um reale XML-Dokumente sauber zu parsen.