在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";
根据 documentation,saveXML
唯一支持的选项是 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()
如果我有一个 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";
根据 documentation,saveXML
唯一支持的选项是 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()