W3docs

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 zur RecursiveIterator-Schnittstelle, die SimpleXMLElement implementiert. Im alltäglichen Code rufen Sie children() 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 $isPrefix gleich true ist, ein Namespace-Präfix). Bei null (Standardwert) werden Kinder aus dem aktuellen Namespace-Kontext zurückgegeben.
  • $isPrefix — auf true setzen, 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 an children() übergeben werden, um die darin enthaltenen Elemente zu erreichen. Der Aufruf von children(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 Markup

Die ä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 SimpleXML

Da 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 eine XPath-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 Sie trim() 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 false prü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.

Übung

Übung
Wofür wird die Funktion getChildren() in PHP verwendet?
Wofür wird die Funktion getChildren() in PHP verwendet?
Was this page helpful?