PHP,XML - >从节点集+数据创建XML

时间:2016-02-03 18:01:21

标签: php xml

我想知道是否有人可以用最佳方法来帮助实现这一目标。

我们有一个包含各种数据集的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>

无需删除所有节点

1 个答案:

答案 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