Signatur
Beschreibung
Dom\XMLDocument ist Teil der neuen, in PHP 8.4 eingeführten Dom-Erweiterung und ersetzt die veraltete DOMDocument-Klasse für XML-Dokumente. Sie implementiert den DOM Living Standard deutlich enger als ihr Vorgänger und verhält sich damit konsistenter und vorhersehbarer.
Im Unterschied zur alten DOMDocument-Klasse wirft Dom\XMLDocument bei Fehlern standardmäßig Exceptions (statt Warnungen) und liefert typsichere Rückgabewerte. Knoten-Rückgaben sind nie mehr false oder null bei Erfolg, sondern stets konkrete DOM-Objekte.
Das Laden von Dokumenten erfolgt über die statischen Fabrikmethoden Dom\XMLDocument::createFromString() und Dom\XMLDocument::createFromFile(), während ein leeres Dokument über Dom\XMLDocument::createEmpty() erzeugt wird. Zum Serialisieren steht saveXml() zur Verfügung.
Für HTML-Dokumente existiert die Schwesterklasse Dom\HTMLDocument. Beide teilen sich die gemeinsame Elternklasse Dom\Document und sind nicht mit der alten DOMDocument-Klasse kompatibel.
Beispiele
XML-Dokument aus String laden und auslesen
<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<bibliothek>
<buch isbn="978-3-16-148410-0">
<titel>PHP 8 Praxis</titel>
<autor>Anna Müller</autor>
</buch>
<buch isbn="978-0-13-110362-7">
<titel>The C Programming Language</titel>
<autor>Brian W. Kernighan</autor>
</buch>
</bibliothek>
XML;
$doc = Dom\XMLDocument::createFromString($xml);
$buecher = $doc->getElementsByTagName('buch');
foreach ($buecher as $buch) {
$isbn = $buch->getAttribute('isbn');
$titel = $buch->getElementsByTagName('titel')[0]->textContent;
$autor = $buch->getElementsByTagName('autor')[0]->textContent;
echo "[$isbn] $titel — $autor\n";
}
XML-Dokument programmatisch erstellen und serialisieren
<?php
$doc = Dom\XMLDocument::createEmpty();
$root = $doc->createElement('katalog');
$doc->appendChild($root);
$produkt = $doc->createElement('produkt');
$produkt->setAttribute('id', '42');
$root->appendChild($produkt);
$name = $doc->createElement('name', 'Kaffeemaschine');
$produkt->appendChild($name);
$preis = $doc->createElement('preis', '89.99');
$preis->setAttribute('waehrung', 'EUR');
$produkt->appendChild($preis);
echo $doc->saveXml();
XML-Datei laden und per XPath abfragen
<?php
// Beispiel: XML aus einem String als "Datei" simulieren (normalerweise: createFromFile('datei.xml'))
$xml = '<?xml version="1.0"?><stamm><mitarbeiter id="1"><name>Karl</name></mitarbeiter><mitarbeiter id="2"><name>Lisa</name></mitarbeiter></stamm>';
$doc = Dom\XMLDocument::createFromString($xml);
$xpath = new Dom\XPath($doc);
$ergebnisse = $xpath->query('//mitarbeiter[@id="2"]/name');
foreach ($ergebnisse as $knoten) {
echo $knoten->textContent . "\n";
}
// Wichtig · Fallstricke
Kompatibilität: Dom\XMLDocument ist nicht mit der alten DOMDocument-Klasse austauschbar. Knoten aus dem neuen Namespace (Dom\Element, Dom\Text usw.) können nicht in alte DOM*-Klassen importiert werden und umgekehrt.
Fehlerbehandlung: Im Gegensatz zu DOMDocument löst Dom\XMLDocument bei Parse-Fehlern standardmäßig eine Dom\Exception aus. Das Early-Return-Muster mit libxml_use_internal_errors() ist hier nicht nötig und nicht anwendbar.
Sicherheit: Beim Laden von externen XML-Quellen (z. B. aus Nutzereingaben oder Netzwerk) besteht die Gefahr von XXE-Angriffen (XML External Entity). Es wird empfohlen, externe Entitäten grundsätzlich zu deaktivieren und nur vertrauenswürdige XML-Daten zu verarbeiten. Die neue API hat XXE-Schutz standardmäßig aktiviert.
Verfügbarkeit: Die Klasse steht erst ab PHP 8.4.0 zur Verfügung. Für ältere PHP-Versionen muss weiterhin DOMDocument verwendet werden.