提问人:MajorTom 提问时间:9/27/2022 最后编辑:MajorTom 更新时间:9/30/2022 访问量:70
PHP 比较两个 XML 文件,结果都为 XML
PHP compare two XML files with result in both of XML
问:
我想在 php 中比较两个具有相同结构的未知 XML 文件。我是XML(不是php)的新手,因此我遇到了一些麻烦。我找到了很多示例代码,但我无法将代码移植到我的问题中。 我的问题:
下面是两个示例 XML 文件
xml1:
<start>
<eins>
<zwei>
<drei>test1</drei>
<vier>test2</vier>
<fuenf>test3</fuenf>
</zwei>
<sechs>
<sieben>
<acht>test4</acht>
<neun>tets5</neun>
</sieben>
</sechs>
</eins>
</start>
xml2:
<start>
<eins>
<zwei>
<fuenf>test3</fuenf>
<zehn>hmm</zehn>
<drei>testFail</drei>
</zwei>
<sechs>
<sieben>
<neun>tets5</neun>
<acht>test3</acht>
</sieben>
</sechs>
</eins>
</start>
现在我想比较它们,并希望返回两个具有相同节点顺序的 xml 文件,并向我显示丢失一次。
输出 newXML1:
<start>
<eins>
<zwei>
<drei>test1</drei>
<vier>test2</vier>
<fuenf>test3</fuenf>
<missing>missing</missing>
</zwei>
<sechs>
<sieben>
<acht>test4</acht>
<neun>tets5</neun>
</sieben>
</sechs>
</eins>
</start>
输出 newXML2:
<start>
<eins>
<zwei>
<drei>testFail</drei>
<missing>missing</missing>
<fuenf>test3</fuenf>
<zehn>hmm</zehn>
</zwei>
<sechs>
<sieben>
<acht>test3</acht>
<neun>tets5</neun>
</sieben>
</sechs>
</eins>
</start>
在输出 XML 中,我希望两个节点具有相同的节点顺序,并且我想查看缺少哪个元素。练习的结果是使用它来可视化 html 页面上两个 xml 文件的差异。非常感谢您的帮助。:-)
@LMC你问我当前的代码。在这里:
function checkXML($xml, $xml2, &$xmlNew, &$nodeCount) {
foreach($xml as $key => $xmlpos) {
if (isset($xml2->$key))
{
if($xmlpos->count())
{
xmlwriter_start_element($xmlNew,$key);
$nodeCount = $xmlpos->count();
checkXML($xmlpos, $xml2->$key, $xmlNew, $nodeCount);
$nodeCount--;
}
else
{
xmlwriter_write_element($xmlNew,$key,$xml2->$key);
}
}
else
{
//echo $key . " - this is missing";
xmlwriter_write_element($xmlNew,"missing","missing");
}
}
xmlwriter_end_document($xmlNew);
}
$xmlStr1 = '<?xml version="1.0" encoding="UTF-8"?>
<start>
<eins>
<zwei>
<drei>test1</drei>
<vier>test2</vier>
<fuenf>test3</fuenf>
</zwei>
<sechs>
<sieben>
<acht>test4</acht>
<neun>tets5</neun>
</sieben>
</sechs>
</eins>
</start>';
$xmlStr2 = '<?xml version="1.0" encoding="UTF-8"?>
<start>
<eins>
<zwei>
<fuenf>test3</fuenf>
<zehn>hmm</zehn>
<drei>testFail</drei>
</zwei>
<sechs>
<sieben>
<neun>tets5</neun>
<acht>test3</acht>
</sieben>
</sechs>
</eins>
</start>';
$xml1 = new SimpleXMLElement($xmlStr1);
$xml2 = new SimpleXMLElement($xmlStr2);
$newXML = xmlwriter_open_memory();
xmlwriter_start_document($newXML,"1.0");
$nodeCount[0] = 0;
checkXML($xml1, $xml2, $newXML, $nodeCount);
//Header('Content-type: text/xml');
echo "<xmp>";
$xml_data=xmlwriter_output_memory($newXML);
echo $xml_data;
echo "</xmp>";
output:
<?xml version="1.0"?>
<eins>
<zwei>
<drei>testFail</drei>
<missing>missing</missing>
<fuenf>test3</fuenf>
</zwei>
</eins>
<sechs>
<sieben>
<acht>test3</acht>
<neun>tets5</neun>
</sieben>
</sechs>
这段代码几乎是我想要的。现在我遇到了一个问题,我必须记住哪个节点必须在正确的位置关闭。该节点目前关闭得太早。<eins>
答: 暂无答案
评论