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| Parameter | Beschreibung |
|---|---|
$filename | Pfad oder URL der zu ladenden XML-Datei. |
$class_name | Zu instanziierende Klasse. Muss SimpleXMLElement erweitern; standardmäßig SimpleXMLElement selbst. |
$options | Bitmaske der libxml-Optionskonstanten wie LIBXML_NOCDATA oder LIBXML_NOBLANKS. |
$namespace_or_prefix | Namespace-Präfix oder URI, um den zurückgegebenen Baum einzuschränken. |
$is_prefix | true, 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 SmithBeachten 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 EURMit 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
falsevs. Warnung. Eine fehlende Datei oder ein Syntaxfehler gibtfalsezurü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.99funktioniert zufällig;(float) $book->price === 29.99ist das, was Sie eigentlich wollen. - Remote-Dateien lesen.
$filenamekann eine URL sein, aber das erfordert, dassallow_url_fopenin derphp.iniaktiviert 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.