PHP SimpleXML - simplexml_load_file und simplexml_load_string
Die PHP SimpleXML-Erweiterung bietet eine einfache Möglichkeit, XML-Daten zu parsen und zu bearbeiten. Erfahren Sie mehr über simplexml_load_file und simplexml_load_string.
XML mit PHP SimpleXML lesen und abrufen
Die PHP-Erweiterung SimpleXML ist der schnellste Weg, XML-Dokumente zu lesen und zu bearbeiten. Anstatt einen Knotenbaum manuell zu durchlaufen, wandelt SimpleXML das gesamte Dokument in ein reguläres PHP-Objekt um, dessen Elemente Sie mit der vertrauten Eigenschafts- und Array-Syntax erreichen — $xml->title, $xml->item[0], $xml['id'].
Dieses Kapitel behandelt die zwei Funktionen zum Laden von XML — simplexml_load_file() (für eine Datei oder URL) und simplexml_load_string() (für XML, das bereits als String vorliegt) — sowie das Lesen von Elementen, das Lesen von Attributen, das Iterieren über wiederholte Knoten, das Hinzufügen neuer Daten und die Serialisierung des Ergebnisses zurück in XML.
SimpleXML ist im Standard-PHP-Paket enthalten und standardmäßig aktiviert, sodass in der Regel nichts installiert werden muss.
Wann SimpleXML verwenden (und wann nicht)
- SimpleXML verwenden für das Lesen und leichte Bearbeiten von wohlgeformtem XML: Konfigurationsdateien, RSS/Atom-Feeds, einfache API-Antworten, Sitemaps.
- DOMDocument verwenden, wenn Sie eine detaillierte Kontrolle benötigen: Knoten an einer bestimmten Position einfügen, mit Kommentaren arbeiten oder Schema-Validierung durchführen.
- Den XML Parser (Expat) verwenden für sehr große Dokumente, die Sie ereignisweise streamen möchten, ohne alles in den Speicher zu laden.
XML-Daten laden
Der erste Schritt besteht darin, das XML in ein SimpleXML-Objekt zu laden. Es gibt zwei Einstiegspunkte, und welchen Sie wählen, hängt nur davon ab, wo Ihr XML sich aktuell befindet.
Eine XML-Datei mit simplexml_load_file() laden
simplexml_load_file() liest XML aus einem lokalen Pfad oder einer URL und gibt ein SimpleXMLElement zurück. Bei einem Parse-Fehler gibt es false zurück und gibt eine Warnung aus.
<?php
// books.xml on disk, or "https://example.com/feed.xml"
$xml = simplexml_load_file('books.xml');
if ($xml === false) {
echo "Failed to load XML.";
} else {
echo $xml->book[0]->title; // first <title>
}Einen XML-String mit simplexml_load_string() laden
Wenn das XML bereits in einer Variablen vorliegt — zum Beispiel im Body einer HTTP-Antwort — verwenden Sie stattdessen simplexml_load_string().
Beide Funktionen geben das Wurzelelement des Dokuments zurück, keine Hülle darum. Im obigen Beispiel ist $xml also <root>, und $xml->child ist der <child>-Knoten darin.
Tipp: Ein
SimpleXMLElementhat einen stringähnlichen Wert, ist aber dennoch ein Objekt. Umschließen Sie es mit(string)(oder verketten Sie es), wenn Sie einen einfachen PHP-String benötigen — zum Beispiel$title = (string) $xml->book[0]->title;. Weitere Details finden Sie unter SimpleXML in einen String umwandeln.
Auf XML-Daten zugreifen
Nach dem Laden lesen Sie das Dokument mit Objekt- und Array-Syntax.
Auf Elemente zugreifen
Untergeordnete Elemente sind Objekteigenschaften. Wenn ein Tag mehrfach vorkommt, können Sie wie bei einem Array darauf zugreifen; [0] ist das erste Vorkommen.
<?php
$data = <<<XML
<library>
<book><title>PHP Basics</title></book>
<book><title>Advanced XML</title></book>
</library>
XML;
$xml = simplexml_load_string($data);
echo $xml->book[0]->title, "\n"; // PHP Basics
echo $xml->book[1]->title, "\n"; // Advanced XMLÜber wiederholte Elemente iterieren
Da sich wiederholende Tags wie eine iterierbare Liste verhalten, ist foreach der natürliche Weg, alle davon zu lesen:
<?php
$data = <<<XML
<library>
<book><title>PHP Basics</title></book>
<book><title>Advanced XML</title></book>
</library>
XML;
$xml = simplexml_load_string($data);
foreach ($xml->book as $book) {
echo $book->title, "\n";
}
// PHP Basics
// Advanced XMLAuf Attribute zugreifen
Auf Attribute wird mit Array-Syntax auf dem Element zugegriffen, das sie enthält:
<?php
$xml = simplexml_load_string('<book id="42" lang="en"><title>PHP</title></book>');
echo $xml['id'], "\n"; // 42
echo $xml['lang'], "\n"; // enXML-Daten ändern
SimpleXML kann auch Dokumente direkt erstellen und bearbeiten.
Elemente hinzufügen
addChild() fügt ein neues Element an und gibt das erstellte Element zurück, sodass Sie weiter verketten können:
<?php
$xml = simplexml_load_string('<root></root>');
$xml->addChild('child', 'Value');
echo $xml->child; // ValueAttribute hinzufügen
addAttribute() fügt dem Element, auf dem Sie es aufrufen, ein Attribut hinzu:
<?php
$xml = simplexml_load_string('<root><child>Value</child></root>');
$xml->child->addAttribute('attribute', 'on');
echo $xml->child['attribute']; // onSimpleXML zurück in XML umwandeln
asXML() serialisiert das Objekt zurück in einen XML-String (ohne Argument) oder schreibt es direkt in eine Datei (wenn Sie einen Pfad übergeben). So speichern Sie die vorgenommenen Änderungen. Weitere Informationen finden Sie unter der asXML-Methode.
<?php
$xml = simplexml_load_string('<root></root>');
$xml->addChild('child', 'Value');
echo $xml->asXML();
// <?xml version="1.0"?>
// <root><child>Value</child></root>Fehlerhafte XML-Daten behandeln
Bei einem Fehler geben diese Funktionen false zurück und lösen eine Warnung aus, auf die schwer zu reagieren ist. Wandeln Sie Warnungen mit libxml_use_internal_errors() in sammelbare Fehler um:
<?php
libxml_use_internal_errors(true);
$xml = simplexml_load_string('<root><child></root>'); // missing </child>
if ($xml === false) {
foreach (libxml_get_errors() as $error) {
echo trim($error->message), "\n";
}
libxml_clear_errors();
}Fazit
SimpleXML ist der schnellste Weg von einer XML-Datei oder einem String zu lesbaren PHP-Daten. Laden Sie mit simplexml_load_file() oder simplexml_load_string(), lesen Sie Elemente und Attribute mit Eigenschafts- und Array-Syntax, iterieren Sie über wiederholte Knoten mit foreach, bearbeiten Sie mit addChild() und addAttribute(), und serialisieren Sie mit asXML() zurück. Für komplexere Verarbeitung wechseln Sie zu DOMDocument; für das Streaming großer Dateien verwenden Sie den XML Parser.