W3docs

PHP XML DOM

Lernen Sie, die PHP-DOM-Erweiterung zu nutzen, um XML-Dokumente zu laden, erstellen, ändern, abfragen (XPath) und speichern.

Wofür die DOM-Erweiterung gedacht ist

Die DOM-Erweiterung (Document Object Model) stellt ein XML-Dokument als Baumstruktur von Knoten im Arbeitsspeicher dar. Jedes Element, Attribut, Textfragment und Kommentar ist ein Knotenobjekt, das Sie lesen, verschieben, hinzufügen oder löschen können. Da das gesamte Dokument in den RAM geladen wird, ist DOM das richtige Werkzeug, wenn Sie XML ändern, ein Dokument von Grund auf erstellen oder XPath-Abfragen ausführen möchten, die im Baum springen.

Diese Seite behandelt das Laden, Erstellen, Ändern, Abfragen und Speichern von XML mit DOMDocument. Die Abwägungen gegenüber den leichteren Alternativen sind:

  • Verwenden Sie die SimpleXML-Erweiterung, wenn Sie wohlgeformtes XML nur schnell und mit minimalem Code lesen müssen.
  • Verwenden Sie den XML-Parser (Expat) für ereignisbasiertes Streaming sehr großer Dateien, die nicht vollständig im Arbeitsspeicher gehalten werden sollen.
  • Greifen Sie auf DOM (diese Seite) zurück, wenn Sie vollständige Lese-/Schreibkontrolle und XPath benötigen.

DOM und libxml teilen sich ein Fehlersystem; siehe PHP libxml für die Verwaltung von Parse-Fehlern.

Erweiterung aktivieren

Die DOM-Erweiterung wird mit PHP ausgeliefert und ist in den meisten Builds standardmäßig aktiviert (sie ist Teil des php-xml-Pakets unter Debian/Ubuntu). Sie können überprüfen, ob sie verfügbar ist:

<?php
var_dump(extension_loaded('dom')); // bool(true)

Falls sie fehlt, installieren Sie das php-xml-Paket für Ihre Plattform oder aktivieren Sie extension=dom in php.ini, und starten Sie dann Ihren Webserver neu.

Ein XML-Dokument laden

Erstellen Sie ein DOMDocument und laden Sie XML aus einem String mit loadXML() oder aus einer Datei mit load(). Aktivieren Sie zuerst libxml_use_internal_errors(true), damit fehlerhafte Markup-Inhalte keine Warnungen ausgeben — Sie sammeln die Fehler stattdessen selbst ein.

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<books>
  <book id="1"><title>PHP for Beginners</title></book>
  <book id="2"><title>Advanced XML</title></book>
</books>
XML;

libxml_use_internal_errors(true);
$doc = new DOMDocument();

if (!$doc->loadXML($xml)) {
    foreach (libxml_get_errors() as $error) {
        echo trim($error->message) . "\n";
    }
    libxml_clear_errors();
    exit;
}

$root = $doc->documentElement;
echo "Root element: {$root->nodeName}\n";

foreach ($root->getElementsByTagName('title') as $title) {
    echo "Title: {$title->nodeValue}\n";
}

Ausgabe:

Root element: books
Title: PHP for Beginners
Title: Advanced XML

getElementsByTagName() gibt eine live DOMNodeList zurück, über die Sie direkt mit foreach iterieren können — das ist in der Regel übersichtlicher als das Durchlaufen von childNodes, das auch die Leerzeichen-Textknoten zwischen Elementen enthält.

Ein XML-Dokument von Grund auf erstellen

Erstellen Sie ein Dokument, indem Sie Knoten auf dem DOMDocument anlegen und sie in ein übergeordnetes Element einhängen. Setzen Sie formatOutput = true, um eingerückte, lesbare Ausgabe von saveXML() zu erhalten.

<?php
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->formatOutput = true;

$root = $doc->createElement('books');
$doc->appendChild($root);

$book = $doc->createElement('book');
$book->setAttribute('id', '1');
$root->appendChild($book);

$title = $doc->createElement('title', 'PHP for Beginners');
$book->appendChild($title);

echo $doc->saveXML();

Ausgabe:

<?xml version="1.0" encoding="UTF-8"?>
<books>
  <book id="1">
    <title>PHP for Beginners</title>
  </book>
</books>

Hier verwendete Schlüsselmethoden:

  • createElement($name, $value) — erstellt ein Element, optional mit Textinhalt.
  • setAttribute($name, $value) — fügt ein Attribut zu einem Element hinzu oder überschreibt es.
  • appendChild($node) — hängt einen Knoten als letztes Kind seines übergeordneten Elements an.

Achtung: Das direkte Übergeben von Text an createElement('title', $userInput) maskiert &, < oder > nicht zuverlässig. Für nicht vertrauenswürdigen Text fügen Sie stattdessen einen Textknoten an: $el->appendChild($doc->createTextNode($userInput)), der Sonderzeichen immer korrekt maskiert.

Knoten ändern und löschen

Da der gesamte Baum im Arbeitsspeicher liegt, können Sie Text ändern, Attribute aktualisieren und Elemente entfernen, bevor Sie speichern. Ein sauberer Weg, den richtigen Knoten zu finden, ist XPath (wird als Nächstes behandelt), aber hier verwenden wir es direkt:

<?php
$xml = <<<XML
<books>
  <book id="1"><title>PHP for Beginners</title></book>
  <book id="2"><title>Advanced XML</title></book>
</books>
XML;

$doc = new DOMDocument();
$doc->formatOutput = true;
$doc->loadXML($xml);

$xpath = new DOMXPath($doc);

// Rename the first title
$first = $xpath->query('//book[@id="1"]/title')->item(0);
$first->nodeValue = 'PHP Essentials';

// Remove the second book
$second = $xpath->query('//book[@id="2"]')->item(0);
$second->parentNode->removeChild($second);

echo $doc->saveXML();

Ausgabe:

<?xml version="1.0"?>
<books>
  <book id="1"><title>PHP Essentials</title></book>

</books>

Um einen Knoten zu löschen, rufen Sie removeChild() auf seinem übergeordneten Element auf, weshalb $second->parentNode->removeChild($second) das übliche Muster ist. Das Zuweisen zu nodeValue ersetzt den Textinhalt eines Elements.

Mit XPath abfragen

DOMXPath ermöglicht die Auswahl von Knoten mit Pfadausdrücken, anstatt den Baum manuell zu durchlaufen — weit prägnanter als verschachtelte Schleifen.

<?php
$xml = <<<XML
<books>
  <book id="1"><title>PHP for Beginners</title></book>
  <book id="2"><title>Advanced XML</title></book>
</books>
XML;

$doc = new DOMDocument();
$doc->loadXML($xml);

$xpath = new DOMXPath($doc);

// Every <title> anywhere in the document
foreach ($xpath->query('//title') as $node) {
    echo $node->nodeValue . "\n";
}

// The title of the book whose id is "2"
$result = $xpath->query('//book[@id="2"]/title');
echo "Book 2: " . $result->item(0)->nodeValue . "\n";

Ausgabe:

PHP for Beginners
Advanced XML
Book 2: Advanced XML

Häufige XPath-Muster:

AusdruckWählt aus
//titleAlle <title>-Elemente in beliebiger Tiefe
/books/book<book>-Kinder direkt unter dem Root-Element <books>
//book[@id="2"]<book>-Elemente mit Attribut id="2"
//book/@idDie id-Attributknoten jedes <book>-Elements
//book[1]Das erste <book>-Element (XPath-Indizes beginnen bei 1)

In eine Datei speichern

Speichern Sie den Baum im Arbeitsspeicher mit save(), das bei einem Fehler false zurückgibt (z. B. bei einem nicht beschreibbaren Verzeichnis).

<?php
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->formatOutput = true;

$root = $doc->createElement('config');
$doc->appendChild($root);
$root->appendChild($doc->createElement('debug', 'false'));

if ($doc->save(__DIR__ . '/output.xml')) {
    echo 'Saved successfully.';
} else {
    echo 'Failed to save — check directory permissions.';
}

Verwenden Sie saveXML() (ohne Argumente), wenn Sie das XML als String erhalten möchten — praktisch, um es von einer API zurückzugeben oder in einer Antwort auszugeben.

Zusammenfassung

  • DOMDocument lädt ein gesamtes XML-Dokument in einen veränderbaren Baum von Knoten.
  • Verwenden Sie loadXML() / load() zum Lesen, createElement() und appendChild() zum Erstellen sowie removeChild() zum Löschen.
  • DOMXPath::query() wählt Knoten mit prägnanten Pfadausdrücken aus.
  • save() schreibt in eine Datei; saveXML() gibt das Dokument als String zurück.
  • Wählen Sie DOM, wenn Sie XML schreiben oder abfragen müssen; wählen Sie SimpleXML für schnelles Lesen und den XML-Parser für das Streaming großer Dateien.

Übungen

Übung
Was können Sie mit dem PHP XML DOM tun?
Was können Sie mit dem PHP XML DOM tun?
Was this page helpful?