Signatur
Beschreibung
SimpleXMLIterator erweitert SimpleXMLElement und implementiert zusätzlich die SPL-Interfaces RecursiveIterator und Countable. Dadurch kann ein XML-Dokument mit Standard-PHP-Iterator-Werkzeugen wie RecursiveIteratorIterator vollständig traversiert werden, ohne eigene Rekursion schreiben zu müssen.
Während SimpleXMLElement bereits einfachen Zugriff auf XML-Strukturen bietet, erlaubt SimpleXMLIterator das systematische Durchlaufen aller Kind-Elemente über current(), key(), next(), rewind() und valid(). Mit hasChildren() und getChildren() lässt sich die Baumstruktur rekursiv abarbeiten.
Typische Anwendungsfälle sind das Einlesen von XML-Feeds, Konfigurationsdateien oder API-Antworten, bei denen die gesamte Hierarchie programmatisch verarbeitet werden soll. Für einfache Zugriffe auf bekannte Elementnamen genügt oft SimpleXMLElement; sobald jedoch unbekannte oder verschachtelte Strukturen dynamisch traversiert werden müssen, ist SimpleXMLIterator die bessere Wahl.
Ein Objekt wird typischerweise mit simplexml_load_string() oder simplexml_load_file() erzeugt, indem als zweites Argument 'SimpleXMLIterator' übergeben wird, oder direkt über den Konstruktor durch Übergabe eines XML-Strings.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $data Pflicht | string | Ein wohlgeformter XML-String oder ein Dateiname/URL, abhängig von $options. |
|
| $options | int | 0 | Optionale LIBXML-Konstanten als Bitmaske, z. B. LIBXML_NOCDATA. |
| $dataIsUrl | bool | false | Wenn true, wird $data als Dateipfad oder URL interpretiert statt als XML-String. |
| $namespaces | string | "" | Namespace-Präfix oder URI, der beim Parsen berücksichtigt werden soll. |
Beispiele
Einfache Iteration über Kind-Elemente
<?php
$xml = <<<XML
<library>
<book><title>PHP Handbuch</title><author>Max Muster</author></book>
<book><title>Clean Code</title><author>Robert Martin</author></book>
</library>
XML;
$iterator = new SimpleXMLIterator($xml);
foreach ($iterator as $tag => $node) {
echo $tag . ': ' . $node->title . ' von ' . $node->author . PHP_EOL;
}
Rekursive Traversierung mit RecursiveIteratorIterator
<?php
$xml = <<<XML
<catalog>
<category name="Programmierung">
<book><title>PHP 8</title></book>
<book><title>JavaScript Grundlagen</title></book>
</category>
<category name="Datenbanken">
<book><title>MySQL Praxis</title></book>
</category>
</catalog>
XML;
$iterator = new SimpleXMLIterator($xml);
$recursive = new RecursiveIteratorIterator(
$iterator,
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($recursive as $name => $node) {
$depth = $recursive->getDepth();
$indent = str_repeat(' ', $depth);
$value = trim((string)$node);
echo $indent . '<' . $name . '>' . ($value !== '' ? $value : '') . PHP_EOL;
}
Laden aus Datei mit simplexml_load_file
<?php
// XML-Datei: data.xml
// <users><user><name>Anna</name></user><user><name>Ben</name></user></users>
$iterator = simplexml_load_file('data.xml', 'SimpleXMLIterator');
if ($iterator === false) {
echo 'Fehler beim Laden der XML-Datei.';
} else {
foreach ($iterator as $user) {
echo 'Benutzer: ' . $user->name . PHP_EOL;
}
}
// Wichtig · Fallstricke
Wohlgeformtheit: Der übergebene XML-String muss wohlgeformt sein. Fehlerhafte XML-Daten führen zu Laufzeitfehlern oder einer false-Rückgabe. Prüfen Sie Fehler mit libxml_get_errors() nach dem Setzen von libxml_use_internal_errors(true).
Externe Datenquellen: Beim Laden von XML aus nicht vertrauenswürdigen Quellen (z. B. User-Input oder externe URLs) besteht die Gefahr von XML External Entity (XXE)-Angriffen. Verwenden Sie LIBXML_NOENT nicht leichtfertig und deaktivieren Sie externe Entitäten mit libxml_disable_entity_loader(true) (PHP < 8.0) bzw. verlassen Sie sich auf die ab PHP 8.0 standardmäßig deaktivierte externe Entity-Auflösung.
Namespaces: Elemente in XML-Namespaces sind über die normalen Iterator-Methoden nicht direkt sichtbar; verwenden Sie children() mit Namespace-Argument oder registerXPathNamespace() für XPath-Abfragen.