Start · Sprachen · PHP · Referenz · Dom\XMLDocument

Dom\XMLDocument

Klasse

Repräsentiert ein XML-Dokument und bietet eine moderne, spezifikationskonforme DOM-API zum Erstellen, Laden und Manipulieren von XML-Inhalten.

seit PHP 8.4.0 Kategorie: xml

Signatur

class Dom\XMLDocument extends Dom\Document

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";
}
[978-3-16-148410-0] PHP 8 Praxis — Anna Müller [978-0-13-110362-7] The C Programming Language — Brian W. Kernighan

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 version="1.0" encoding="UTF-8"?> <katalog><produkt id="42"><name>Kaffeemaschine</name><preis waehrung="EUR">89.99</preis></produkt></katalog>

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";
}
Lisa

// 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.