如何在PHP中合并多个XML文件
我是PHP编程新手,希望能得到任何帮助。我有一个如下所示的Xml文件如何在PHP中合并多个XML文件,php,xml,merge,Php,Xml,Merge,我是PHP编程新手,希望能得到任何帮助。我有一个如下所示的Xml文件 <?xml version="1.0" encoding="UTF-8"?> <results> <test external_id="123"> <result>p</result> </test> <test external_id="1237">
<?xml version="1.0" encoding="UTF-8"?>
<results>
<test external_id="123">
<result>p</result>
</test>
<test external_id="1237">
<result>p</result>
</test>
<test external_id="234">
<result>p</result>
</test>
<test external_id="678">
<result>p</result>
</test>
</results>
P
P
P
P
XML文件是从测试运行生成的。现在,有时测试可能会中断并重新生成另一个xml文件,该文件可能包含与第一个xml文件中生成的值相似的值。例如,Xml文件2可能包含以下值
<?xml version="1.0" encoding="UTF-8"?>
<results>
<test external_id="412">
<result>p</result>
</test>
<test external_id="234">
<result>p</result>
</test>
<test external_id="123">
<result>p</result>
</test>
<test external_id="745">
<result>p</result>
</test>
</results>
P
P
P
P
我需要编写一个PHP脚本,将生成的不同XML文件合并到一个没有重复的XML文件中。最终xml文件中只应出现一次(test external_id=“XXX”)。测试运行期间可能会生成2个以上的XML文件。我已经搜索了stackoverflow上给出的各种解决方案,但没有找到。我已经能够合并文件,但副本仍然存在。到目前为止我所写的。谢谢你期待的帮助
<?php
$doc1 = new DOMDocument();
$doc1->load('11.xml');
$doc2 = new DOMDocument();
$doc2->load('12.xml');
// get 'results' element of document 1
$res1 = $doc1->getElementsByTagName('results')->item(0);
// iterate over 'testcase' elements of document 2
$items2 = $doc2->getElementsByTagName('test');
for ($i = 0; $i < $items2->length; $i ++) {
$item2 = $items2->item($i);
// import/copy item from document 2 to document 1
$item1 = $doc1->importNode($item2, true);
// append imported item to document 1 'res' element
$res1->appendChild($item1);
}
$doc1->save('merged.xml'); //saving into xml file
$seen=array();
$doc3 = new DOMDocument();
$doc3->load('merged.xml');
$results = $doc3->getElementsByTagName('test');
foreach($results as $test){
//$key=$doc3->$test;
if (isset($seen[$test])) {
unset($doc3->$test);
}else{
$seen[$test]=1;
}
}
echo $doc3->asXML();
?>
load('12.xml');
//获取文档1的“结果”元素
$res1=$doc1->getElementsByTagName('results')->项(0);
//迭代文档2的“testcase”元素
$items2=$doc2->getElementsByTagName('test');
对于($i=0;$i<$items2->length;$i++){
$item2=$items2->item($i);
//将项目从文档2导入/复制到文档1
$item1=$doc1->importNode($item2,true);
//将导入的项目追加到文档1“res”元素
$res1->appendChild($item1);
}
$doc1->save('merged.xml')//保存到xml文件
$seen=array();
$doc3=新的DOMDocument();
$doc3->load('merged.xml');
$results=$doc3->getElementsByTagName('test');
foreach($results作为$test){
//$key=$doc3->$test;
如果(isset($SEED[$test])){
未设置($doc3->$test);
}否则{
$SEED[$test]=1;
}
}
echo$doc3->asXML();
?>
使用您拥有的两个文件,更容易获取一个文件并从另一个文件添加元素。首先,它检查节点是否已经存在(使用XPath并计算具有相同ID的元素的数量)。如果节点不存在,它必须首先将节点从一个文档导入到另一个文档,然后将其添加到根元素
$doc1 = new DOMDocument();
$doc1->load('NewFile.xml'); // Change file names as needed.
$xp = new DOMXPath($doc1);
$doc2 = new DOMDocument();
$doc2->load('NewFile1.xml');
$test1 = $doc2->getElementsByTagName('test');
foreach ( $test1 as $testItem ) {
$id = $testItem->getAttribute('external_id');
if ( $xp->evaluate("count(//test[@external_id='{$id}'])") == 0 ) {
$copyNode = $doc1->importNode($testItem, true);
$doc1->documentElement->appendChild($copyNode);
}
}
echo $doc1->saveXML();
XPath并不是运行最快的东西,但是这样做比循环遍历文档(IMHO)更容易
如果您有大文件,这不是最好的解决方案,因为它将两个文档的所有内容都保存在内存中。这可能是重复的,这是一个家庭作业吗?“我需要编写一个PHP脚本…”然后执行该操作。如果有代码,请发布代码并卡住somewhere@WaqasBukhary,我已经试过了,它实际上合并了文件,但有重复的。我只需要每次测试一次。如何修改脚本以删除重复项
$seen=array()$doc3=新的DOMDocument()$doc3->load('merged.xml')$结果=$doc3->getElementsByTagName('test');foreach($results as$test){//$key=$doc3->$test;if(isset($seen[$test]){unset($doc3->$test);}else{$seen[$test]=1;}}echo$doc3->asXML()代码>