¿Qué versión de PHPUnit es esto? Estoy bastante seguro de que las versiones recientes son compatibles con las comparaciones de DomDocument.
Versión corta: utilice la configuración $doc->preserveWhiteSpace
para eliminar el espacio en blanco, y luego use $doc->C14N()
para quitar los comentarios y obtener una cadena que puede comparar.
OK, aquí está un script se puede jugar con, tenga en cuenta que las líneas EOD;
no pueden tener al final, o espacios iniciales.
$x1 = <<<EOD
<responses>
<response id="12">
<foo>bar</foo>
<lorem>ipsum</lorem>
<sit>dolor</sit>
<!--This is a comment -->
</response></responses>
EOD;
$x2 = <<<EOD
<responses>
<response id="12">
<lorem>ipsum</lorem><sit>dolor</sit>
<foo>bar</foo>
<!--This is another comment -->
</response>
</responses>
EOD;
// El siguiente bloque es parte del mismo archivo, sólo estoy haciendo de este formato a la ruptura de modo que el sistema de resaltado de sintaxis stackoverflow no se ahogue.
$USE_C14N = true; // Try false, just to see the difference.
$d1 = new DOMDocument(1.0);
$d2 = new DOMDocument(1.0);
$d1->preserveWhiteSpace = false;
$d2->preserveWhiteSpace = false;
$d1->formatOutput = false; // Only useful for "pretty" output with saveXML()
$d2->formatOutput = false; // Only useful for "pretty" output with saveXML()
$d1->loadXML($x1); // Must be done AFTER preserveWhiteSpace and formatOutput are set
$d2->loadXML($x2); // Must be done AFTER preserveWhiteSpace and formatOutput are set
if($USE_C14N){
$s1 = $d1->C14N(true, false);
$s2 = $d2->C14N(true, false);
} else {
$s1 = $d1->saveXML();
$s2 = $d2->saveXML();
}
echo $s1 . "\n";
echo $s2 . "\n";
salida con $USE_C14N=true;
<responses><response id="12"><foo>bar</foo><lorem>ipsum</lorem><sit>dolor</sit></response></responses>
<responses><response id="12"><lorem>ipsum</lorem><sit>dolor</sit><foo>bar</foo></response></responses>
salida con $USE_C14N=false;
<?xml version="1.0"?>
<responses><response id="12"><foo>bar</foo><lorem>ipsum</lorem><sit>dolor</sit><!--This is a comment --></response></responses>
<?xml version="1.0"?>
<responses><response id="12"><lorem>ipsum</lorem><sit>dolor</sit><foo>bar</foo><!--This is another comment --></response></responses>
Tenga en cuenta que $doc->C14N()
podría ser más lento, pero creo que es probable que despojar a los comentarios es deseable. Tenga en cuenta que todo esto también asume que el espacio en blanco en su XML no es importante, y es probable que haya algunos casos de uso donde esa suposición no es correcta ...
¿qué tal eliminar todos los espacios en blanco y luego comparar los hash sha1? –