Signatur
Beschreibung
XMLDiff\DOM ist eine Klasse der PECL-Erweiterung xmldiff, die es ermöglicht, zwei XML-Dokumente in Form von DOMDocument-Objekten miteinander zu vergleichen und die ermittelte Differenz (ein sog. Diff) anschließend wieder auf ein Dokument anzuwenden (Patch).
Die Klasse erbt von XMLDiff\Base und stellt damit die Methoden diff() und merge() bereit. Im Gegensatz zu den Schwesternklassen XMLDiff\Memory und XMLDiff\File arbeitet XMLDiff\DOM direkt mit DOMDocument-Instanzen, was die nahtlose Integration in bestehenden DOM-basierten Code erleichtert.
Typische Einsatzgebiete sind die Versionierung von XML-Konfigurationsdateien, das strukturierte Tracking von Änderungen in XML-Daten oder das automatisierte Zusammenführen verschiedener Dokumentversionen.
Die Erweiterung basiert intern auf der libdavydov-Bibliothek und erzeugt standardkonformes XMLDiff-Output, das als DOMDocument zurückgegeben wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $nsname | string | Optionaler Namespace-Name (URI), der für das XMLDiff-Ausgabedokument verwendet werden soll. Wird er weggelassen, wird ein Standard-Namespace benutzt. |
Rückgabewert
Beispiele
Zwei DOMDocument-Objekte vergleichen (diff)
<?php
// Zwei XML-Strings als DOMDocument laden
$from = new DOMDocument();
$from->loadXML('<root><item id="1">Alt</item></root>');
$to = new DOMDocument();
$to->loadXML('<root><item id="1">Neu</item><item id="2">Zusatz</item></root>');
// XMLDiff\DOM-Instanz erzeugen und Differenz berechnen
$differ = new XMLDiff\DOM();
$diff = $differ->diff($from, $to);
if ($diff instanceof DOMDocument) {
echo $diff->saveXML();
} else {
echo 'Kein Unterschied oder Fehler aufgetreten.';
}
Diff auf ein DOMDocument anwenden (merge)
<?php
$from = new DOMDocument();
$from->loadXML('<root><item id="1">Alt</item></root>');
$to = new DOMDocument();
$to->loadXML('<root><item id="1">Neu</item><item id="2">Zusatz</item></root>');
$differ = new XMLDiff\DOM();
// Differenz ermitteln
$diff = $differ->diff($from, $to);
// Differenz auf das Ausgangsdokument anwenden
$result = $differ->merge($from, $diff);
if ($result instanceof DOMDocument) {
// Sollte dem $to-Dokument entsprechen
echo $result->saveXML();
} else {
echo 'Merge fehlgeschlagen.';
}
// Wichtig · Fallstricke
PECL-Abhängigkeit: Die Klasse ist nur verfügbar, wenn die PECL-Erweiterung xmldiff installiert und in der php.ini geladen ist. Sie ist nicht im PHP-Kern enthalten.
Rückgabewert von diff() und merge(): Beide Methoden geben bei Erfolg ein neues DOMDocument-Objekt zurück. Bei identischen Dokumenten oder einem Fehler kann null zurückgegeben werden — eine Überprüfung des Rückgabewerts ist daher empfehlenswert.
Kompatibilität: Die xmldiff-Erweiterung befindet sich seit Jahren im PECL-Beta-Status. Vor dem Einsatz in Produktivumgebungen sollten Kompatibilität und Stabilität sorgfältig geprüft werden.