Signatur
Beschreibung
XMLDiff\File ist eine Klasse der xmldiff-Erweiterung (PECL) und ermöglicht es, zwei XML-Dateien anhand ihrer Dateipfade miteinander zu vergleichen. Das Ergebnis ist ein XML-Dokument, das die Unterschiede zwischen den beiden Eingabedateien beschreibt und wieder auf eine Datei oder als Zeichenkette ausgegeben werden kann.
Im Gegensatz zu XMLDiff\Memory, die XML-Inhalte als Zeichenketten entgegennimmt, liest XMLDiff\File die XML-Daten direkt von Dateipfaden. Das macht sie besonders praktisch, wenn große XML-Dokumente verarbeitet werden sollen, ohne sie vollständig in den Arbeitsspeicher laden zu müssen.
Die Klasse erbt von XMLDiff\Base und stellt die Methoden diff() und merge() bereit. Mit diff() wird die Differenz zweier XML-Dateien ermittelt, während merge() eine Originaldatei und ein Diff-Dokument wieder zusammenführt und das Ergebnis als Zeichenkette oder Datei zurückgibt.
Typische Einsatzgebiete sind Versionierungssysteme für XML-Konfigurationen, Synchronisation von Datei-Importen und -Exporten sowie das Nachverfolgen von Änderungen in XML-basierten Datenstrukturen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $nsname | string | Optionaler Namespace-Name (Präfix), der im erzeugten Diff-XML für die xmldiff-eigenen Elemente verwendet wird. Standardmäßig wird ein interner Standardwert genutzt. |
Rückgabewert
Beispiele
Zwei XML-Dateien vergleichen und Differenz speichern
<?php
// Zwei einfache XML-Dateien erstellen
file_put_contents('/tmp/original.xml', '<?xml version="1.0"?><root><item>Hallo</item></root>');
file_put_contents('/tmp/modified.xml', '<?xml version="1.0"?><root><item>Welt</item></root>');
// XMLDiff\File-Objekt erstellen
$differ = new XMLDiff\File();
// Differenz ermitteln — gibt den Pfad zur Diff-Datei oder XML-String zurück
$diff = $differ->diff('/tmp/original.xml', '/tmp/modified.xml');
echo $diff;
// Ausgabe: Ein XML-Dokument, das die Änderung von "Hallo" zu "Welt" beschreibt
Differenz erstellen und anschließend zusammenführen (merge)
<?php
file_put_contents('/tmp/a.xml', '<?xml version="1.0"?><catalog><book id="1"><title>PHP Grundlagen</title></book></catalog>');
file_put_contents('/tmp/b.xml', '<?xml version="1.0"?><catalog><book id="1"><title>PHP Fortgeschritten</title></book></catalog>');
$differ = new XMLDiff\File();
// Diff erzeugen und in Datei speichern
$diff = $differ->diff('/tmp/a.xml', '/tmp/b.xml');
file_put_contents('/tmp/diff.xml', $diff);
echo "Diff gespeichert.\n";
// Merge: Original + Diff => Ergebnis
$merged = $differ->merge('/tmp/a.xml', '/tmp/diff.xml');
echo $merged;
// Ausgabe: XML mit dem Inhalt von b.xml ("PHP Fortgeschritten")
// Wichtig · Fallstricke
PECL-Abhängigkeit: XMLDiff\File ist Teil der xmldiff-Erweiterung, die nicht im PHP-Kern enthalten ist. Sie muss über PECL installiert werden (pecl install xmldiff) und setzt die libdiff-Bibliothek voraus.
Dateipfade: Die an diff() und merge() übergebenen Pfade müssen für den PHP-Prozess lesbar sein. Ungültige oder nicht vorhandene Pfade führen zu Fehlern oder leeren Rückgabewerten — eine vorherige Prüfung mit file_exists() und is_readable() ist empfehlenswert.
Sicherheit: Werden Dateipfade aus Benutzereingaben übernommen, muss eine strikte Validierung erfolgen, um Path-Traversal-Angriffe (../../etc/passwd) zu verhindern. Verwende realpath() und prüfe, ob der aufgelöste Pfad innerhalb des erlaubten Verzeichnisses liegt.
Verfügbarkeit: Die Verfügbarkeit und der genaue API-Umfang können je nach installierter Version der xmldiff-Erweiterung variieren. Prüfe die Kompatibilität mit phpversion('xmldiff').