W3docs

simplexml_load_file()

SimpleXML ist eine PHP-Erweiterung mit einer einfachen API für die Arbeit mit XML-Dokumenten. Die Funktion simplexml_load_file() lädt XML-Dateien.

Einführung

simplexml_load_file() liest eine XML-Datei von der Festplatte (oder einer URL) und wandelt deren Inhalt in ein SimpleXMLElement-Objekt um, das Sie mit der gewöhnlichen PHP-Eigenschafts- und Array-Syntax navigieren können. Es ist der dateibasierte Einstiegspunkt der SimpleXML-Erweiterung — der einfachste Weg, ein XML-Dokument in etwas umzuwandeln, über das Sie iterieren und das Sie auslesen können.

Verwenden Sie diese Funktion, wenn Sie eine XML-Datei haben — eine Konfigurationsdatei, einen RSS/Atom-Feed, eine auf der Festplatte gespeicherte API-Antwort oder eine Sitemap — und Sie Werte daraus extrahieren möchten, ohne selbst einen Parser schreiben zu müssen. Wenn Ihr XML in einem String statt in einer Datei vorliegt, verwenden Sie stattdessen das Gegenstück simplexml_load_string().

Dieses Kapitel behandelt die Funktionssignatur, ein vollständiges funktionierendes Beispiel (einschließlich der gelesenen XML-Datei), den Zugriff auf Attribute und Namespaces sowie die saubere Behandlung von Ladefehlern.

Syntax

simplexml_load_file(
    string $filename,
    ?string $class_name = SimpleXMLElement::class,
    int $options = 0,
    string $namespace_or_prefix = "",
    bool $is_prefix = false
): SimpleXMLElement|false
ParameterBeschreibung
$filenamePfad oder URL der zu ladenden XML-Datei.
$class_nameZu instanziierende Klasse. Muss SimpleXMLElement erweitern; standardmäßig SimpleXMLElement selbst.
$optionsBitmaske der libxml-Optionskonstanten wie LIBXML_NOCDATA oder LIBXML_NOBLANKS.
$namespace_or_prefixNamespace-Präfix oder URI, um den zurückgegebenen Baum einzuschränken.
$is_prefixtrue, wenn das vorherige Argument ein Präfix ist, false, wenn es eine URI ist.

Rückgabewert: ein SimpleXMLElement bei Erfolg oder false, wenn die Datei nicht gelesen werden kann oder fehlerhaftes XML enthält.

Ein vollständiges Beispiel

Angenommen, eine Datei namens books.xml befindet sich neben Ihrem Skript:

<?xml version="1.0" encoding="UTF-8"?>
<library>
  <book id="b1">
    <title>The PHP Way</title>
    <author>Jane Doe</author>
    <price currency="USD">29.99</price>
  </book>
  <book id="b2">
    <title>XML in Practice</title>
    <author>John Smith</author>
    <price currency="EUR">24.50</price>
  </book>
</library>

Laden Sie sie, prüfen Sie das Parsing und iterieren Sie über die <book>-Elemente:

<?php

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

if ($xml === false) {
    echo "Failed to load XML file.\n";
    exit(1);
}

foreach ($xml->book as $book) {
    echo $book->title . " by " . $book->author . "\n";
}

Ausgabe:

The PHP Way by Jane Doe
XML in Practice by John Smith

Beachten Sie den strikten === false-Vergleich. SimpleXML-Objekte sind „truthy", sodass eine lockere if (!$xml)-Prüfung in Randfällen falsch reagieren kann — vergleichen Sie immer explizit mit false.

Attribute lesen

SimpleXML stellt untergeordnete Elemente als Objekteigenschaften ($book->title) und XML-Attribute über Array-Zugriff ($book['id']) zur Verfügung. Da die Werte SimpleXMLElement-Objekte und keine einfachen Strings sind, casten Sie sie mit (string), bevor Sie sie in Berechnungen oder Vergleichen verwenden:

<?php

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

foreach ($xml->book as $book) {
    $id       = (string) $book['id'];
    $currency = (string) $book->price['currency'];
    echo "{$id}: {$book->title} — {$book->price} {$currency}\n";
}

Ausgabe:

b1: The PHP Way — 29.99 USD
b2: XML in Practice — 24.50 EUR

Mit Namespaces arbeiten

Wenn ein Dokument XML-Namespaces deklariert, erreicht der einfache Eigenschaftszugriff nur den Standard-Namespace. Verwenden Sie ->children($namespaceUri), um in einen Namespace-Zweig zu navigieren, und ->attributes($namespaceUri), um Namespace-Attribute zu lesen:

<?php
// Access elements in the Atom namespace.
$atom = $xml->children('http://www.w3.org/2005/Atom');
echo $atom->title;

Einen tieferen Einblick in Namespaces und Traversierung finden Sie unter SimpleXML in PHP.

Ladefehler sauber behandeln

Standardmäßig gibt fehlerhaftes XML PHP-Warnungen aus. Um diese zu unterdrücken und die Fehler selbst zu untersuchen, aktivieren Sie die interne Fehlerbehandlung mit libxml_use_internal_errors() vor dem Laden:

<?php

libxml_use_internal_errors(true);

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

if ($xml === false) {
    echo "Could not load the file:\n";
    foreach (libxml_get_errors() as $error) {
        echo "  " . trim($error->message) . "\n";
    }
    libxml_clear_errors();
}

Ausgabe:

Could not load the file:
  failed to load external entity "missing.xml"

Dieses Muster hält Ihre Ausgabe sauber und gibt Ihnen strukturierten Zugriff auf jeden Parse-Fehler über libxml_get_errors().

Häufige Fallstricke

  • false vs. Warnung. Eine fehlende Datei oder ein Syntaxfehler gibt false zurück und löst eine Warnung aus, sofern Sie die interne Fehlerbehandlung nicht aktiviert haben. Prüfen Sie immer den Rückgabewert.
  • Casten vor dem Vergleichen. $book->price == 29.99 funktioniert zufällig; (float) $book->price === 29.99 ist das, was Sie eigentlich wollen.
  • Remote-Dateien lesen. $filename kann eine URL sein, aber das erfordert, dass allow_url_fopen in der php.ini aktiviert ist.
  • Zurückschreiben. SimpleXML eignet sich hervorragend zum Lesen. Um ein Element zurück in einen XML-String zu serialisieren, rufen Sie asXML() auf.

Fazit

simplexml_load_file() ist der schnellste Weg, eine XML-Datei in PHP in einen navigierbaren Objektbaum zu laden. Kombinieren Sie es mit strikten === false-Prüfungen, (string)-Casts beim Lesen von Werten und libxml-Fehlerbehandlung, und Sie haben eine robuste Grundlage für die Verarbeitung von Feeds, Konfigurationen und XML-APIs. Für String-Eingaben verwenden Sie simplexml_load_string(), und für vollständige Traversierungstechniken lesen Sie weiter mit SimpleXML in PHP.

Übungen

Übung
Was ist der Zweck der Funktion SimpleXML_Load_File in PHP?
Was ist der Zweck der Funktion SimpleXML_Load_File in PHP?
Was this page helpful?