getchildren()
SimpleXML ist eine PHP-Erweiterung mit einer einfachen API für XML-Dokumente. SimpleXMLElement::children() ruft direkte Kindelemente eines Knotens ab.
SimpleXMLElement::children()
SimpleXML ist eine PHP-Erweiterung, die eine unkomplizierte API zum Parsen und Bearbeiten von XML-Dokumenten bietet. Mit der Methode SimpleXMLElement::children() können die direkten untergeordneten Elemente eines Knotens als SimpleXMLElement-Objekte abgerufen und durchlaufen werden. Diese Anleitung erklärt, was die Methode zurückgibt, wie sie Namespaces behandelt und wie sie auf realen Dokumenten eingesetzt wird.
Der ältere Alias
getChildren()gehört zurRecursiveIterator-Schnittstelle, dieSimpleXMLElementimplementiert. Im alltäglichen Code rufen Siechildren()direkt auf; diese Seite behandelt diese Methode.
Was SimpleXMLElement::children() zurückgibt
children() gibt ein SimpleXMLElement zurück, über das Sie mit foreach die direkten Kinder des aktuellen Knotens durchlaufen können – eine automatische Rekursion in Kindeskinder findet nicht statt. Die Methode akzeptiert ein optionales Argument $namespace, um das Ergebnis auf einen XML-Namespace zu beschränken. Dies ist unverzichtbar, wenn ein Dokument verschiedene Vokabulare mischt (beispielsweise RSS zusammen mit Dublin Core).
Syntax
public function children(?string $namespace = null, bool $isPrefix = false): ?SimpleXMLElement$namespace— eine Namespace-URI (oder, wenn$isPrefixgleichtrueist, ein Namespace-Präfix). Beinull(Standardwert) werden Kinder aus dem aktuellen Namespace-Kontext zurückgegeben.$isPrefix— auftruesetzen, wenn ein Präfix (z. B."bk") statt der vollständigen URI übergeben wird.
Hinweis zu Standard-Namespaces: Verwendet XML einen Standard-Namespace (deklariert mit
xmlns="..."ohne Präfix), muss diese Namespace-URI anchildren()übergeben werden, um die darin enthaltenen Elemente zu erreichen. Der Aufruf vonchildren(null)auf einem solchen Knoten liefert nichts.
Einfaches Traversieren
Das folgende Beispiel lädt XML aus einem string mit simplexml_load_string(), sodass es ohne externe Datei ausgeführt werden kann, und durchläuft den Baum mit verschachtelten children()-Aufrufen. getName() gibt den Tag-Namen jedes Elements zurück:
<?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";
}
}Ausgabe:
book:
title = The PHP Way
author = Ada Byte
book:
title = XML in Depth
author = Lee MarkupDie äußere Schleife besucht jedes <book>; die innere Schleife besucht dessen direkte Kinder (<title>, <author>). Ein Kind als string zu casten (hier durch Verkettung) liefert seinen Textinhalt.
Filtern nach Namespace
Wenn ein Dokument Namespaces deklariert, übergeben Sie die URI an children(), um nur die passenden Elemente auszuwählen. getNamespaces(true) gibt jeden Namespace im Dokument nach Präfix geordnet zurück, sodass die URI dynamisch nachgeschlagen werden kann:
<?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";
}Ausgabe:
Namespaced PHP
Beyond SimpleXMLDa jedes <bk:book> und sein <bk:title> im bk-Namespace liegen, muss diese URI auf jeder Ebene übergeben werden, um sie zu erreichen.
Häufige Fallstricke
- Keine Rekursion.
children()gibt nur direkte Kinder zurück. Um einen gesamten Baum zu durchlaufen, rufen Sie die Methode innerhalb der Schleife erneut auf (wie oben gezeigt) oder verwenden Sie eineXPath-Abfrage. - Fehlender Namespace-Filter liefert nichts. Wenn eine Schleife bei namespaced XML leer bleibt, wurde wahrscheinlich vergessen, die Namespace-URI zu übergeben.
- Text vs. Elemente. Casten Sie ein Element zu
(string)und wenden Sietrim()an, wenn nur der Textinhalt benötigt wird – insbesondere bei Knoten mit gemischtem Inhalt. - Eingaben stets validieren. Beim Laden aus einer Datei oder URL sollten Sie auf
falseprüfen und die libxml-Fehlerbehandlung aktivieren, bevor Sie dem Ergebnis vertrauen.
Fazit
SimpleXMLElement::children() ist der Standardweg, um die direkten Kindelemente eines XML-Knotens in PHP zu durchlaufen. In Kombination mit getName() für Tag-Namen, Namespace-URIs zum Filtern und string-Casting für Textinhalt lassen sich verschachtelte Dokumente sauber navigieren. Weiterführende Informationen finden Sie in der PHP SimpleXML-Übersicht sowie in der verwandten Methode attributes() zum Lesen von Elementattributen.