Start · Sprachen · PHP · Referenz · SimpleXMLIterator

SimpleXMLIterator

Klasse

Ermöglicht die rekursive Iteration über alle Knoten eines <code>SimpleXMLElement</code>-Objektes mithilfe von SPL-Iterator-Schnittstellen.

seit PHP 5.1.3 Kategorie: xml

Signatur

class SimpleXMLIterator extends SimpleXMLElement implements RecursiveIterator, Countable

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;
}
book: PHP Handbuch von Max Muster book: Clean Code von Robert Martin

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;
}
<category> <book> <title>PHP 8</title> <book> <title>JavaScript Grundlagen</title> <category> <book> <title>MySQL Praxis</title>

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;
    }
}
Benutzer: Anna Benutzer: Ben

// 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.