Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中合并多个XML文件_Php_Xml_Merge - Fatal编程技术网

如何在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">

我是PHP编程新手,希望能得到任何帮助。我有一个如下所示的Xml文件

<?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()