2012-05-04 65 views
0

我是一種情況,我想在XML文件的多個位置添加相同的內容。僅供參考 - 第一次處理DOMDocument。 說出XML看起來像PHP DOMDocument - InsertBefore多次

<rrd> 
    <rra> 
    <cdp_prep> 
     <ds> 
     <value>nan</value> 
     </ds> 
     <ds> 
     <value>nan</value> 
     </ds> 
     <ds> 
     <value>nan</value> 
     <ds> 
    </cdp_prep> 
    <database> 
     ... 
    </database> 
    </rra> 
    <rra> 
    <cdp_prep> 
     <ds> 
     <value>nan</value> 
     <ds> 
     </ds> 
     <value>nan</value> 
     <ds> 
     <ds> 
     <value>nan</value> 
     </ds> 
    </cdp_prep> 
    <database> 
     ... 
    </database> 
    </rra> 
</rrd> 

如果我使用像$rrdCDPds = $xRRD->query("/rrd/rra/cdp_prep/ds");的東西的話,我會得到所有的<ds>元素。在這種情況下,我的長度爲6.但是,我試圖在每個<cdp_prep>元素的第二個<ds>上insertBefore。我的問題是,如果我查詢「/ rrd/rra/cdp_prep」,我如何針對每個<cdp_prep>元素在第二個<ds>元素上定位insertBefore?

+0

的XML是無效的..你的意思是關閉'ds'元素? –

+0

對不起。星期五下午......並敲打鍵盤上的頭:) –

回答

0

基本步驟是:

  1. 選擇要用作insertBefore參考節點使用的節點。你可以使用子軸和位置測試得到這個結果:cdp_prep/child::ds[position()=2],它可以縮寫爲cdp_prep/ds[2]
  2. 準備您要插入的節點。
  3. 對於每個匹配參考節點,請克隆要插入的節點,然後插入它。

例子:

$dom = new DOMDocument(); 
$dom->loadXML($xml); 
$xp = new DOMXPath($dom); 

$newcontent = $dom->createDocumentFragment(); 
$newcontent->appendChild($dom->createElement('NEWCONTENT')); 
$newcontent->appendChild($dom->createTextNode("\n  ")); 

$DSs = $xp->query('/rrd/rra/cdp_prep/ds[2]'); 

foreach ($DSs as $ds) { 
    $ds->parentNode->insertBefore($newcontent->cloneNode(true), $ds); 
} 

echo $dom->saveXML(); 
+0

工程很棒。謝謝您的幫助。 –

1

可以使用child軸XPath來選擇第二DS孩子:

/rrd/rra/cdp_prep/child::ds[2]