Start · Sprachen · PHP · Referenz · simplexml_load_file

simplexml_load_file

Funktion

Liest eine XML-Datei und gibt ein <code>SimpleXMLElement</code>-Objekt zurück, mit dem die XML-Struktur einfach traversiert werden kann.

seit PHP 5.0.0 Kategorie: xml

Signatur

simplexml_load_file(string $filename, ?string $class_name = SimpleXMLElement::class, int $options = 0, string $namespace_or_prefix = "", bool $is_prefix = false): SimpleXMLElement|false

Beschreibung

simplexml_load_file() parst eine XML-Datei und wandelt sie in ein SimpleXMLElement-Objekt um. Über dieses Objekt kann die gesamte XML-Struktur wie ein verschachteltes PHP-Objekt gelesen werden: Elemente werden als Objekteigenschaften und Attribute über die Methode attributes() zugänglich.

Die Funktion eignet sich besonders für einfache bis mittelkomplexe XML-Dokumente, bei denen kein vollständiges DOM benötigt wird. Sie ist deutlich schlanker als die DOMDocument-API und erlaubt direkten Zugriff auf Element-Inhalte über Eigenschaftsnamen.

Über den Parameter $options lassen sich LibXML-Konstanten übergeben, zum Beispiel LIBXML_NOCDATA, um CDATA-Abschnitte automatisch in normalen Text umzuwandeln. Mit $namespace_or_prefix und $is_prefix kann ein bestimmter XML-Namensraum aktiv gesetzt werden.

Im Fehlerfall (Datei nicht lesbar, ungültiges XML) gibt die Funktion false zurück und erzeugt eine Warnung. Mit libxml_use_internal_errors(true) lassen sich Fehler gezielt abfangen und über libxml_get_errors() auslesen.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zur XML-Datei. Kann ein lokaler Dateipfad oder eine URL sein, sofern URL-Wrapper aktiviert sind (allow_url_fopen).
$class_name ?string SimpleXMLElement::class Name der Klasse, die für das zurückgegebene Objekt verwendet wird. Muss von SimpleXMLElement abgeleitet sein, um eigene Methoden hinzuzufügen.
$options int 0 Bitmaske aus LibXML-Konstanten, z. B. LIBXML_NOCDATA oder LIBXML_NOERROR.
$namespace_or_prefix string XML-Namensraum-URI oder Präfix, der beim Laden berücksichtigt werden soll.
$is_prefix bool false Wenn true, wird $namespace_or_prefix als Namensraum-Präfix interpretiert, andernfalls als URI.

Rückgabewert

Typ
SimpleXMLElement|false
Beschreibung
Gibt ein SimpleXMLElement-Objekt zurück, das die geparste XML-Struktur repräsentiert. Bei einem Fehler (Datei nicht gefunden, Parse-Fehler) wird false zurückgegeben.

Beispiele

Einfaches Lesen einer XML-Datei

<?php
// books.xml:
// <?xml version="1.0"?>
// <library>
//   <book id="1">
//     <title>PHP-Handbuch</title>
//     <author>Max Mustermann</author>
//   </book>
//   <book id="2">
//     <title>XML für Profis</title>
//     <author>Erika Musterfrau</author>
//   </book>
// </library>

$xml = simplexml_load_file('books.xml');

if ($xml === false) {
    echo 'Fehler beim Laden der XML-Datei.';
    exit;
}

foreach ($xml->book as $book) {
    $id = (int) $book['id'];
    echo "ID: $id, Titel: {$book->title}, Autor: {$book->author}\n";
}
ID: 1, Titel: PHP-Handbuch, Autor: Max Mustermann ID: 2, Titel: XML für Profis, Autor: Erika Musterfrau

Fehlerbehandlung mit libxml_use_internal_errors

<?php
libxml_use_internal_errors(true);

$xml = simplexml_load_file('ungueltig.xml');

if ($xml === false) {
    $fehler = libxml_get_errors();
    foreach ($fehler as $f) {
        echo 'XML-Fehler in Zeile ' . $f->line . ': ' . trim($f->message) . "\n";
    }
    libxml_clear_errors();
} else {
    echo 'XML erfolgreich geladen.';
}
XML-Fehler in Zeile 1: Start tag expected, '<' not found

Erweiterung mit eigener SimpleXMLElement-Subklasse

<?php
class MeinXML extends SimpleXMLElement {
    public function getTitelGroß(): string {
        return strtoupper((string) $this->title);
    }
}

$xml = simplexml_load_file('books.xml', MeinXML::class);

if ($xml !== false) {
    echo $xml->book[0]->getTitelGroß();
}
PHP-HANDBUCH

// Wichtig · Fallstricke

Sicherheitshinweis: Wenn die XML-Datei aus einer nicht vertrauenswürdigen Quelle stammt (z. B. Benutzereingabe als URL), besteht die Gefahr von XXE-Angriffen (XML External Entity Injection). Ab PHP 8.0 sind externe Entities standardmäßig deaktiviert. In älteren Versionen sollte libxml_disable_entity_loader(true) vor dem Laden aufgerufen werden.

Bei sehr großen XML-Dateien kann simplexml_load_file() viel Arbeitsspeicher verbrauchen, da das gesamte Dokument in den Speicher geladen wird. Für solche Fälle ist ein SAX-basierter Parser (xml_parse()) oder XMLReader besser geeignet.

CDATA-Abschnitte werden standardmäßig nicht als reiner Text behandelt. Mit der Option LIBXML_NOCDATA werden sie automatisch in normale Textknoten umgewandelt.