W3docs

PHP XML-Parser: Ein umfassender Leitfaden

XML in PHP parsen mit SimpleXML, XMLReader und DOM. Ausführbare Beispiele, Fehlerbehandlung mit libxml und Auswahl des richtigen Parsers.

XML (eXtensible Markup Language) ist ein weit verbreitetes Format zum Austausch strukturierter Daten zwischen Anwendungen, Webdiensten und Plattformen. Da viele APIs, Konfigurationsdateien und Feeds weiterhin XML verwenden, ist das Lesen von XML in PHP eine praktische Fähigkeit. Dieser Leitfaden erklärt die drei eingebauten XML-Parser, die mit PHP ausgeliefert werden — SimpleXML, XMLReader und DOM — zeigt ausführbare Beispiele für jeden und hilft Ihnen, den richtigen für Ihren Anwendungsfall auszuwählen.

Was ist ein PHP XML-Parser?

Ein XML-Parser ist eine Bibliothek, die ein XML-Dokument liest, prüft ob es wohlgeformt ist, und Ihrem Code strukturierten Zugriff auf seine Elemente, Attribute und Text ermöglicht. PHP wird mit drei nativen Parsern ausgeliefert, alle basierend auf demselben libxml-Engine:

  • SimpleXML — ein baumbasierter Parser, der das gesamte Dokument in ein einfach zu verwendendes Objekt lädt.
  • DOM — ein baumbasierter Parser, der dem W3C Document Object Model folgt, mit einer umfangreicheren API zum Navigieren und Bearbeiten.
  • XMLReader — ein streaming, cursorbasierter Parser, der einen Knoten nach dem anderen liest, ohne das vollständige Dokument in den Speicher zu laden.

„Baumbasiert" bedeutet, dass das gesamte Dokument als navigierbare Struktur im Speicher gehalten wird — einfach zu verwenden, aber speicherhungrig bei großen Dateien. „Streaming" (auch Pull-Parsing genannt) bedeutet, dass der Parser Knoten für Knoten durch das Dokument geht, wodurch der Speicherbedarf bei großen Dateien gering bleibt.

Alle Beispiele unten verwenden dasselbe Musterdokument, das als String eingebettet ist, damit Sie sie direkt ausführen können:

$xmlString = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<library>
  <book>
    <title>PHP for Beginners</title>
    <author>Jane Doe</author>
    <year>2021</year>
  </book>
  <book>
    <title>Advanced PHP</title>
    <author>John Smith</author>
    <year>2023</year>
  </book>
</library>
XML;

SimpleXML

SimpleXML bietet den schnellsten Weg, XML zu lesen. Sie laden ein Dokument in ein SimpleXMLElement-Objekt und greifen dann mit gewöhnlichen Objekteigenschaften auf seine Daten zu — $xml->book[0]->title statt Methodenaufrufen. Es ist ideal für kleine bis mittlere Dokumente, deren Struktur Sie bereits kennen.

Verwenden Sie simplexml_load_string() für XML, das Sie bereits als String haben, oder simplexml_load_file() um direkt aus einer Datei oder URL zu lesen.

$xml = simplexml_load_string($xmlString);

// Access a single value by position
echo $xml->book[0]->title . "\n";

// Loop over every <book> element
foreach ($xml->book as $book) {
    echo "{$book->title} by {$book->author} ({$book->year})\n";
}

Ausgabe:

PHP for Beginners
PHP for Beginners by Jane Doe (2021)
Advanced PHP by John Smith (2023)

Beachten Sie, dass Elementwerte SimpleXMLElement-Objekte sind, keine einfachen Strings. Verkettung oder echo konvertiert sie automatisch in Text, aber casten Sie mit (string), wenn Sie einen echten String benötigen. Siehe PHP SimpleXML für einen tieferen Einblick, einschließlich des Lesens von Attributen und Namensräumen.

XMLReader

XMLReader ist ein Streaming-, Vorwärts-Parser. Statt einen Baum aufzubauen, geht er Knoten für Knoten durch das Dokument, sodass der Speicher unabhängig von der Dateigröße gering bleibt. Das macht ihn zur richtigen Wahl für große Feeds oder Exporte, bei denen das vollständige Laden alles auf einmal den Speicher erschöpfen würde.

Rufen Sie read() auf, um zum nächsten Knoten zu wechseln, und prüfen Sie dann nodeType und name, um zu entscheiden, was zu tun ist. Verwenden Sie open() zum Lesen aus einer Datei oder URL, oder XML() zum Lesen aus einem String.

$reader = new XMLReader();
$reader->XML($xmlString);

while ($reader->read()) {
    if ($reader->nodeType === XMLReader::ELEMENT && $reader->name === 'title') {
        echo $reader->readString() . "\n";
    }
}
$reader->close();

Ausgabe:

PHP for Beginners
Advanced PHP

Der Kompromiss liegt in der Bequemlichkeit: Da XMLReader immer nur einen Knoten hält, gibt es keinen wahlfreien Zugriff — Sie können nicht zurückspringen oder beliebige Elemente abfragen, wie es mit einem Baum möglich wäre. Ein gängiges Muster besteht darin, zum gewünschten Element zu streamen und dann diesen Teilbaum mit expand() an SimpleXML oder DOM zu übergeben.

DOM

Die DOM-Erweiterung implementiert das standardisierte W3C Document Object Model. Wie SimpleXML lädt sie das gesamte Dokument in einen Baum, bietet aber eine umfangreichere API zum Navigieren von Knoten, Abfragen mit XPath und Erstellen oder Modifizieren von Elementen. Greifen Sie auf DOM zurück, wenn Sie XML schreiben oder umstrukturieren müssen, nicht nur lesen.

Laden Sie XML mit loadXML() (aus einem String) oder load() (aus einer Datei), und gehen Sie dann mit Methoden wie getElementsByTagName() durch den Baum.

$dom = new DOMDocument();
$dom->loadXML($xmlString);

$titles = $dom->getElementsByTagName('title');
foreach ($titles as $title) {
    echo $title->nodeValue . "\n";
}

Ausgabe:

PHP for Beginners
Advanced PHP

getElementsByTagName() gibt eine DOMNodeList zurück, die Sie iterieren oder mit ->item(0) indexieren können. Für komplexere Abfragen können Sie DOMDocument mit DOMXPath kombinieren. Siehe PHP XML DOM für die vollständige API.

Umgang mit Parse-Fehlern

Standardmäßig löst fehlerhaftes XML PHP-Warnungen aus, auf die programmatisch schwer zu reagieren ist. Rufen Sie libxml_use_internal_errors(true) auf, um diese Warnungen zu unterdrücken und stattdessen strukturierte Fehlerobjekte mit libxml_get_errors() zu sammeln. Alle drei Parser teilen diesen libxml-Fehlermechanismus.

libxml_use_internal_errors(true);

$badXml = '<library><book><title>Unclosed</book></library>';
$xml = simplexml_load_string($badXml);

if ($xml === false) {
    echo "Failed to parse XML:\n";
    foreach (libxml_get_errors() as $error) {
        echo trim($error->message) . "\n";
    }
    libxml_clear_errors();
}

Ausgabe:

Failed to parse XML:
Opening and ending tag mismatch: title line 1 and book
Opening and ending tag mismatch: book line 1 and library
Premature end of data in tag library line 1

Prüfen Sie immer den Rückgabewert einer Ladefunktion (false bei Fehler), bevor Sie das Ergebnis verwenden. Weitere Informationen zu diesen Hilfsfunktionen finden Sie unter PHP libxml.

Den richtigen PHP XML-Parser wählen

ParserModellSpeicherAm besten geeignet für
SimpleXMLBaumHochSchnelles Lesen kleiner/mittlerer Dokumente
DOMBaumHochBearbeiten, XPath-Abfragen, XML erstellen
XMLReaderStreamingNiedrigGroße Dokumente einmalig von oben nach unten lesen

Kurz gesagt:

  • Wählen Sie SimpleXML, wenn Sie einfach bekanntes, mäßig großes XML mit minimalem Code lesen möchten.
  • Wählen Sie DOM, wenn Sie Dokumente ändern, XPath-Abfragen ausführen oder XML generieren müssen.
  • Wählen Sie XMLReader, wenn das Dokument so groß ist, dass das vollständige Laden in den Speicher ein Problem darstellt.

Fazit

PHP bietet Ihnen drei native XML-Parser, jeder für eine andere Aufgabe geeignet: SimpleXML für schnelle, einfache Lesevorgänge, DOM für vollständige Manipulation und XMLReader für speichereffizientes Streaming großer Dateien. Passen Sie den Parser an Ihre Dokumentgröße an und daran, ob Sie nur lesen oder auch schreiben müssen, umschließen Sie Ladevorgänge mit libxml-Fehlerbehandlung, und Sie können XML in jedem PHP-Projekt zuverlässig parsen.

Um tiefer einzusteigen, erkunden Sie PHP SimpleXML-Parser, PHP XML-Parser (Expat) und PHP XML DOM.

Übungen

Übung
Welche dieser Optionen sind eingebaute PHP XML-Parser, die in diesem Leitfaden behandelt werden?
Welche dieser Optionen sind eingebaute PHP XML-Parser, die in diesem Leitfaden behandelt werden?
Was this page helpful?