假设我有两个结构相同的XML文件。我需要创建具有相同结构的新XML文件,其中包含初始两个XML文件中的选定节点。
我将尝试用下面的例子再次解释。
input1.xml
:
<parent>
<item id="100">
...
</item>
<item id="101">
...
</item>
<item id="102">
...
</item>
<item id="103">
...
</item>
</parent>
input2.xml
:
<parent>
<item id="200">
...
</item>
<item id="201">
...
</item>
<item id="202">
...
</item>
<item id="203">
...
</item>
</parent>
现在我需要选择从input1.xml
100,103
具有 id 的节点,从input2.xml
中选择 id202,203
的节点。此外,它应该按照203,100,103,202
的顺序排列,最终结果看起来像波纹管。
result.xml
:
<parent>
<item id="203">
...
</item>
<item id="100">
...
</item>
<item id="103">
...
</item>
<item id="202">
...
</item>
</parent>
没有必要创建新文件,如果我能以看起来像result.xml
的方式编辑input2.xml
,那将是理想的解决方案。
到目前为止我做了什么:
我的方法是首先从input2.xml
中删除节点,然后将节点添加到input1.xml
。 我有以下功能从input2.xml
文件中删除节点。
例如:调用delete_record(200,'input2.xml','result.xml')
可以删除节点200,我可以以类似的方式重复它。
function delete_record($id, $input, $output){
$xml = new DOMDocument();
$xml->load($input);
$deals = $xml->getElementsByTagName('item');
foreach ($deals as $deal) {
$deal_id = $deal->getElementsByTagName('id')->item(0)->nodeValue;
if ($deal_id == $id) {
$id_matched = true;
$deal->parentNode->removeChild($deal);
break;
}
}
if ($id_matched == true) {
if ($xml->save($output)) {
return true;
}
}
}
但是我仍然在努力寻找一种方法,如何将节点添加到同一个result.xml
文件中以及如何下订单。
任何形式的帮助将不胜感激。
没有必要弄乱删除,只需做你需要做的事情。从两个文件中按 id 选取节点,并将其按顺序排列:
// merge all nodes by Id
function getNodesById($id, ...$xpaths) {
$result = [];
foreach($xpaths as $xpath) {
foreach($xpath->query("//item[@id='$id']") as $node) {
$result[] = $node;
}
}
return $result;
}
// load source documents
$xml1 = new DOMDocument();
$xml1->load(....);
$xpath1 = new DomXpath($xml1);
$xml2 = new DOMDocument();
$xml2->load(....);
$xpath2 = new DomXpath($xml2);
// create result document
$result = new DOMDocument();
$parent = $result->createElement("parent");
$result->appendChild($parent);
// populate result document with nodes:
foreach([203, 100, 103, 202] as $id) {
$nodesToInsert = getNodesById($id, xpath1, xpath2);
if (count($nodesToInsert) !== 1) {
// resolve conflicts, if any
throw new Exception("Id $id is not found or not unique.");
}
$parent->appendChild($result->importNode($nodesToInsert[0], true));
}
// or save it to a file
echo $result->saveXml();