我想知道是否有人可以用最佳方法来帮助实现这一目标。
我们有一个包含各种数据集的XML,在XML中是每个通道的数据集。
每个频道都有自己的节目。
我希望做的是,如果ChannelA要处理XML 它出于某种原因出错,我可以简单地提取它正在处理的NODE集并从中构建XML。
或者我必须声明每个NODE集来构建XML然后基本上导入它吗?
XML有大约30/40个节点(我发布这样的节点作为例子)所以在PHP中输入这些只是丑陋,而且随着我们添加更多集合,它就会变得非常可怕保持它。
<data>
<MainUpdate>
<Chan>5</Chan>
<Data1></<Data1>
<Data2></<Data2>
<Data3></<Data3>
<Data4></<Data4>
<Data5></<Data5>
</MainUpdate>
<MainUpdate>
<Chan>8</Chan>
<Data1></<Data1>
<Data2></<Data2>
<Data3></<Data3>
<Data4></<Data4>
<Data5></<Data5>
</MainUpdate>
<MainUpdate>
<Chan>10</Chan>
<Data1></<Data1>
<Data2></<Data2>
<Data3></<Data3>
<Data4></<Data4>
<Data5></<Data5>
</MainUpdate>
</data>
如果Channel8处理此XML,并且它只处理Channel8数据 我希望能够只用:
创建一个XML<data>
<MainUpdate>
<Chan>8</Chan>
<Data1></<Data1>
<Data2></<Data2>
<Data3></<Data3>
<Data4></<Data4>
<Data5></<Data5>
</MainUpdate>
</data>
无需删除所有节点
答案 0 :(得分:0)
xpath
选择所需的节点(及其子节点)和importNode()
将其转换为新的DOMDocument
代码示例:
$xpath = new DOMXpath($doc); // assume original XML in $doc
$e = $xpath->query("/data/MainUpdate[Chan = '8']")->item(0);
请注意[]
中的条件,假设<Chan>
为唯一,生成的DOMNodeList
将有1 DOMElement
,其中我们抓住第一个且仅将其存储在$e
。
如果没有$e
,则NULL
为<Chan>
,请在继续之前进行检查。
现在以root身份<data></data>
创建一个新文档并导入$e
:
$newdoc = new DOMDocument();
$newdoc->loadXML("<data />");
$e = $newdoc->importNode($e, true);
$newdoc->documentElement->appendChild($e);
看到它有效:https://eval.in/513276