PHP 比较两个 XML 文件,结果都为 XML

PHP compare two XML files with result in both of XML

提问人:MajorTom 提问时间:9/27/2022 最后编辑:MajorTom 更新时间:9/30/2022 访问量:70

问:

我想在 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>

PHP XML 比较

评论

0赞 LMC 9/27/2022
到目前为止,您尝试的 php 代码是什么?鼓励提出问题,以提供一个最小限度的可重复示例
0赞 MajorTom 9/30/2022
@LMC我已经把我当前的代码放在了我的问题中。我仍然无法正确关闭节点。

答: 暂无答案