这是哪个版本的PHPUnit?我非常确定最近的版本都支持DomDocument比较。
简短版:使用
$doc->preserveWhiteSpace
设置来移除空格,然后使用
$doc->C14N()
来删除注释并获得一个可以比较的字符串。
好的,这里有一个你可以尝试的脚本,请注意
EOD;
行不能有任何前导或尾随空格。
$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;
// 下一个块是同一文件的一部分,我只是在这里加入了这个格式中断,以便StackOverflow语法高亮系统不会崩溃。
$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";
使用$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>
使用$USE_C14N=false;
输出
<?xml version="1.0"?>
<responses><response id="12"><foo>bar</foo><lorem>ipsum</lorem><sit>dolor</sit></response></responses>
<?xml version="1.0"?>
<responses><response id="12"><lorem>ipsum</lorem><sit>dolor</sit><foo>bar</foo></response></responses>
请注意,$doc->C14N()
可能会比较慢,但我认为删除注释是可取的。此外,所有这些都假定您的XML中的空格不重要,可能有一些用例并不适用于此假设...