Signatur
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;
}
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();
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;
}
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;
}
// 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.