Start · Sprachen · PHP · Referenz · SimpleXMLElement

SimpleXMLElement

Klasse

Stellt ein Element eines XML-Dokuments als Objekt dar und ermöglicht einfachen Lese- und Schreibzugriff auf XML-Strukturen.

seit PHP 5.0.0 Kategorie: xml

Signatur

class SimpleXMLElement implements Stringable, Countable, Iterator

Beschreibung

SimpleXMLElement ist die zentrale Klasse der SimpleXML-Erweiterung und ermöglicht es, XML-Dokumente als PHP-Objekte zu manipulieren. Attribute, Kindknoten und Textwerte lassen sich über intuitive Objekt- und Array-Zugriffe lesen und schreiben, ohne einen vollständigen DOM-Baum aufzubauen.

Instanzen entstehen typischerweise durch simplexml_load_string(), simplexml_load_file() oder den Konstruktor der Klasse selbst. Kindknoten sind über Eigenschaftszugriff ($xml->tagName) erreichbar, XML-Attribute über Array-Syntax ($xml['attributName']). Das Iterieren über gleichnamige Geschwisterknoten erfolgt direkt in einer foreach-Schleife.

SimpleXMLElement eignet sich besonders für das schnelle Lesen und Bearbeiten einfacher bis mittelkomplexer XML-Strukturen, z. B. RSS-Feeds, Konfigurationsdateien oder API-Antworten. Für komplexe Transformationen oder das Arbeiten mit Namespaces empfiehlt sich alternativ die DOMDocument-Klasse.

Das Objekt implementiert Countable (Anzahl gleichnamiger Geschwisterknoten via count()) sowie Iterator, sodass Kindknoten direkt iteriert werden können. Mit asXML() lässt sich das Element jederzeit wieder als XML-String serialisieren.

Parameter

Name Typ Default Beschreibung
$data Pflicht string Ein wohlgeformter XML-String oder ein Dateipfad/eine URL, wenn options LIBXML_NOERROR gesetzt und dataIsUrl true ist.
$options int 0 Bitmaske aus LIBXML_*-Konstanten, z. B. LIBXML_NOCDATA, um CDATA-Abschnitte als Text zu erhalten.
$dataIsUrl bool false Wenn true, wird data als Dateipfad oder URL interpretiert statt als XML-String.
$namespaceOrPrefix string "" XML-Namespace-URI oder Präfix, der beim Laden des Dokuments berücksichtigt werden soll.
$isPrefix bool false Wenn true, wird namespaceOrPrefix als Namespace-Präfix behandelt, andernfalls als vollständige Namespace-URI.

Beispiele

XML-String laden und Elemente auslesen

<?php
$xmlString = <<<XML
<bibliothek>
    <buch isbn="978-3-16-148410-0">
        <titel>PHP Praxis</titel>
        <autor>Max Mustermann</autor>
        <jahr>2023</jahr>
    </buch>
    <buch isbn="978-0-13-110362-7">
        <titel>The C Programming Language</titel>
        <autor>Brian W. Kernighan</autor>
        <jahr>1988</jahr>
    </buch>
</bibliothek>
XML;

$xml = new SimpleXMLElement($xmlString);

foreach ($xml->buch as $buch) {
    echo 'Titel: ' . $buch->titel . PHP_EOL;
    echo 'Autor: ' . $buch->autor . PHP_EOL;
    echo 'ISBN:  ' . $buch['isbn'] . PHP_EOL;
    echo '---' . PHP_EOL;
}
Titel: PHP Praxis Autor: Max Mustermann ISBN: 978-3-16-148410-0 --- Titel: The C Programming Language Autor: Brian W. Kernighan ISBN: 978-0-13-110362-7 ---

XML-Element hinzufügen und als String ausgeben

<?php
$xml = new SimpleXMLElement('<config><debug>false</debug></config>');

// Neuen Kindknoten hinzufügen
$db = $xml->addChild('database');
$db->addChild('host', 'localhost');
$db->addChild('port', '3306');
$db->addAttribute('type', 'mysql');

// Als formatierten XML-String ausgeben
echo $xml->asXML();
<?xml version="1.0"?> <config><debug>false</debug><database type="mysql"><host>localhost</host><port>3306</port></database></config>

Namespaces verarbeiten

<?php
$xmlString = <<<XML
<feed xmlns:dc="http://purl.org/dc/elements/1.1/">
    <item>
        <title>Neuigkeit</title>
        <dc:creator>Erika Mustermann</dc:creator>
    </item>
</feed>
XML;

$xml = new SimpleXMLElement($xmlString);

foreach ($xml->item as $item) {
    $dc = $item->children('http://purl.org/dc/elements/1.1/');
    echo 'Titel:   ' . $item->title . PHP_EOL;
    echo 'Autor:   ' . $dc->creator . PHP_EOL;
}
Titel: Neuigkeit Autor: Erika Mustermann

XML aus Datei laden und XPath nutzen

<?php
// Beispiel: XML per simplexml_load_file laden und mit XPath filtern
$xml = simplexml_load_string(<<<XML
<produkte>
    <produkt kategorie="software"><name>PHP</name><preis>0</preis></produkt>
    <produkt kategorie="hardware"><name>Raspberry Pi</name><preis>45</preis></produkt>
    <produkt kategorie="software"><name>MySQL</name><preis>0</preis></produkt>
</produkte>
XML);

$software = $xml->xpath('//produkt[@kategorie="software"]');

foreach ($software as $p) {
    echo $p->name . ' (Preis: ' . $p->preis . ' EUR)' . PHP_EOL;
}
PHP (Preis: 0 EUR) MySQL (Preis: 0 EUR)

// Wichtig · Fallstricke

Sicherheitshinweis: Beim Verarbeiten von XML aus externen Quellen (Nutzereingaben, APIs) besteht die Gefahr von XXE-Angriffen (XML External Entity Injection). SimpleXML nutzt libxml intern – deaktiviere externe Entitäten vor dem Laden: libxml_disable_entity_loader(true) (PHP < 8.0) bzw. setze LIBXML_NONET als Option, um Netzwerkzugriffe aus XML heraus zu unterbinden.

Typkonvertierung: Kindknoten und Attributwerte sind selbst SimpleXMLElement-Objekte, keine einfachen Strings. Für Vergleiche oder Übergabe an Funktionen, die einen String erwarten, ist ein explizites (string)-Casting nötig, z. B. (string)$xml->titel.

Namespaces: Elemente in Namespaces sind nicht direkt über Eigenschaftszugriff erreichbar – hier muss children() mit der Namespace-URI bzw. attributes() verwendet werden.

Große Dokumente: Für sehr große XML-Dateien ist XMLReader die performantere Wahl, da SimpleXML das gesamte Dokument in den Speicher lädt.