在PHP中,如何保存属性排序后的XML?

In PHP, how to saveXML with the attributes sorted?

如果我有一个 DOMDocument 并且我想将它解析成一个字符串,我如何确保属性将按某种 deterministic/normalized 顺序排序(基于属性名称的字典顺序会很好) ?

例如,如何打印 equal 而不是 notequal

 $dom = new DOMDocument();
 $dom->loadXML('<tag a="a" b="b"/>');
 
 $dom2 = new DOMDocument();
 $dom2->loadXML('<tag b="b" a="a"/>');

 echo $dom->saveXML() === $dom2->saveXML() ? "equal" : "notequal";

根据 documentationsaveXML 唯一支持的选项是 LIBXML_NOEMPTYTAG

DOMNode::C14N() 将节点规范化为字符串。

$expected = new DOMDocument();
$expected->loadXML('<tag a="a" b="b"/>');

$actual = new DOMDocument();
$actual->loadXML('<tag b="b" a="a"/>');

echo $expected->C14N() === $actual->C14N() ? "equal" : "notequal";

输出:

equal

如果您要编写单元测试 - PHPUnit 具有针对 XML 的特定断言。

  • assertXmlFileEqualsXmlFile()
  • assertXmlStringEqualsXmlFile()
  • assertXmlStringEqualsXmlString()