2016-02-03 44 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