Signatur
Beschreibung
simplexml_load_string() wandelt einen vollständigen, wohlgeformten XML-String direkt in ein SimpleXMLElement-Objekt um. Das zurückgegebene Objekt bildet das Wurzelelement des Dokuments ab und ermöglicht den Zugriff auf Kindelemente über Objekteigenschaften sowie auf Attribute über Array-Zugriff.
Die Funktion eignet sich besonders dann, wenn XML-Inhalte bereits als String im Speicher vorliegen – etwa als Antwort eines Web-API-Aufrufs, aus einer Datenbank oder aus einem zuvor eingelesenen Puffer. Für das direkte Einlesen aus einer Datei steht simplexml_load_file() zur Verfügung.
Über den Parameter $class_name lässt sich eine eigene Klasse angeben, die SimpleXMLElement erweitert, sodass das zurückgegebene Objekt vom eigenen Typ ist. Mit dem Parameter $options können Libxml-Konstanten wie LIBXML_NOCDATA übergeben werden, um das Parser-Verhalten anzupassen (z. B. CDATA-Abschnitte direkt als Text zu behandeln).
Bei schlecht geformtem XML gibt die Funktion false zurück und löst Warnungen aus. Um Fehler sauber zu behandeln, empfiehlt es sich, libxml_use_internal_errors(true) vor dem Aufruf zu setzen und anschließend libxml_get_errors() zu prüfen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $data Pflicht | string | Ein wohlgeformter XML-String, der geparst werden soll. | |
| $class_name | string | SimpleXMLElement | Name der Klasse, von der das zurückgegebene Objekt eine Instanz sein soll. Die Klasse muss SimpleXMLElement erweitern. |
| $options | int | 0 | Bitmaske aus Libxml-Konstanten, z. B. LIBXML_NOCDATA oder LIBXML_COMPACT, um das Parser-Verhalten zu steuern. |
| $namespace_or_prefix | string | XML-Namespace-URI oder Präfix, der beim Parsen berücksichtigt werden soll. | |
| $is_prefix | bool | false | Wenn true, wird $namespace_or_prefix als Präfix interpretiert; wenn false, als Namespace-URI. |
Rückgabewert
SimpleXMLElement-Objekt zurück, das das Wurzelelement des geparsten XML-Dokuments repräsentiert, oder false bei einem Fehler (z. B. schlecht geformtes XML).Beispiele
Grundlegendes Parsen eines XML-Strings
<?php
$xmlString = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<buch>
<titel>PHP-Praxis</titel>
<autor>Anna Müller</autor>
<preis waehrung="EUR">39.99</preis>
</buch>
XML;
$buch = simplexml_load_string($xmlString);
if ($buch === false) {
echo 'Fehler beim Parsen des XML.';
} else {
echo 'Titel: ' . $buch->titel . PHP_EOL;
echo 'Autor: ' . $buch->autor . PHP_EOL;
echo 'Preis: ' . $buch->preis . ' ' . $buch->preis['waehrung'] . PHP_EOL;
}
Fehlerbehandlung mit libxml_use_internal_errors
<?php
$fehlerhaftesXml = '<root><offen></root>';
libxml_use_internal_errors(true);
$result = simplexml_load_string($fehlerhaftesXml);
if ($result === false) {
$fehler = libxml_get_errors();
foreach ($fehler as $f) {
echo 'Fehler: ' . trim($f->message) . ' (Zeile ' . $f->line . ')' . PHP_EOL;
}
libxml_clear_errors();
} else {
echo 'XML erfolgreich geparst.';
}
API-Antwort als XML parsen und iterieren
<?php
$apiAntwort = <<<XML
<?xml version="1.0"?>
<produkte>
<produkt id="1"><name>Tastatur</name><preis>49.90</preis></produkt>
<produkt id="2"><name>Maus</name><preis>29.90</preis></produkt>
<produkt id="3"><name>Monitor</name><preis>299.00</preis></produkt>
</produkte>
XML;
$produkte = simplexml_load_string($apiAntwort);
foreach ($produkte->produkt as $p) {
printf("[ID %s] %s — %.2f EUR\n", $p['id'], $p->name, (float) $p->preis);
}
// Wichtig · Fallstricke
Sicherheitshinweis (XXE): Ältere Libxml-Versionen sind anfällig für XML External Entity (XXE)-Angriffe, bei denen über externe Entitäten sensitive Dateien ausgelesen werden können. Ab Libxml 2.9.0 sind externe Entitäten standardmäßig deaktiviert. Prüfe bei älteren Umgebungen, ob LIBXML_NOENT gesetzt ist, und vermeide es, wenn der XML-Input aus nicht vertrauenswürdigen Quellen stammt.
CDATA-Abschnitte: Ohne LIBXML_NOCDATA werden CDATA-Abschnitte als SimpleXMLElement-Objekte zurückgegeben. Übergib diese Konstante, wenn du CDATA direkt als String-Wert haben möchtest.
Typumwandlung: Kindelemente und Attributwerte sind zunächst SimpleXMLElement-Objekte. Für explizite Typumwandlungen empfiehlt sich ein Cast auf (string), (int) oder (float).
Namespaces: Elemente mit Namespace-Präfixen sind nicht direkt über Eigenschaften erreichbar. Verwende $xml->children('ns', true) oder $xml->attributes('ns', true), um Namespace-bewusst auf diese zuzugreifen.