Start · Sprachen · PHP · Referenz · simplexml_load_string

simplexml_load_string

Funktion

Parst einen XML-String und gibt ihn als <code>SimpleXMLElement</code>-Objekt zurück, über das sich Struktur und Inhalte des XML-Dokuments bequem traversieren lassen.

seit PHP 5.0.0 Kategorie: xml

Signatur

simplexml_load_string(string $data, string $class_name = 'SimpleXMLElement', int $options = 0, string $namespace_or_prefix = '', bool $is_prefix = false): SimpleXMLElement|false

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

Typ
SimpleXMLElement|false
Beschreibung
Gibt ein 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;
}
Titel: PHP-Praxis Autor: Anna Müller Preis: 39.99 EUR

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.';
}
Fehler: Opening and ending tag mismatch: offen line 1 and root (Zeile 1)

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);
}
[ID 1] Tastatur — 49.90 EUR [ID 2] Maus — 29.90 EUR [ID 3] Monitor — 299.00 EUR

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