2016-02-03 45 views
0

我想知道是否有人可以用最好的方法来实现这一点。PHP,XML - >从节点集+数据创建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> 

没有delcaring所有节点

+1

对不起,我不明白你想要什么。将''与特定的''复制到一个新的XML文件中? – michi

+0

是,如果道工序: 从 - > Chan8- 我要建立的XML从 我可以做到这一点,但我这样做的方式是使用DO M并为每个Value创建NODES,这是一个非常糟糕的方式。 肯定有一个更好的方法。 i..e PHP已经加载到XML中,它保存了值,为什么我不能写出一个函数来写出它读入的内容,而没有声明和写入所有节点。 这是比较清楚吗?抱歉 –

回答

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$eNULL如果没有这样的<Chan>,请在继续之前检查它。

现在创建一个新的文件与<data></data>为根,导入$e

$newdoc = new DOMDocument(); 
$newdoc->loadXML("<data />"); 

$e = $newdoc->importNode($e, true); 
$newdoc->documentElement->appendChild($e);  

看到它的工作:https://eval.in/513276