2012-05-04 9 views
0

私はXMLファイルのいくつかの場所に同じコンテンツを追加したいという状況です。 FYI - 初めてDOMDocumentに取り組んでいます。 は、XMLは、私が$rrdCDPds = $xRRD->query("/rrd/rra/cdp_prep/ds");ようなものを使用する場合は、私はすべての<ds>要素になるだろうPHP DOMDocument - 複数回前に挿入

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

のように見えると言います。この場合、私は6の長さを持っています。しかし、私は各<cdp_prep>要素の2番目の<ds>に先行して挿入しようとしています。私の問題は、私が "/ rrd/rra/cdp_prep"について質問した場合、<cdp_prep>要素ごとに2番目の<ds>要素のinsertBeforeをどうやってターゲットにするのですか?

+0

..あなたは 'ds'要素を閉鎖することを意味しましたか? –

+0

はいごめんなさい。金曜日の午後...そしてキーボードで頭を打つ:) –

答えて

0

基本的な手順は次のとおりです。

  1. あなたはinsertBefore参照ノードとして使用するノードを選択します。子軸と位置テスト:cdp_prep/child::ds[position()=2](これはcdp_prep/ds[2]と省略できます)を使用してこれを取得できます。
  2. 挿入するノードを準備します。
  3. 一致する参照ノードごとに、挿入するノードをクローンしてから挿入します。

例:XMLは有効ではありません

$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

あなたは第二のds子を選択するために、XPathでchild軸を使用することができます。

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