0

XMLファイルの複数の場所に同じコンテンツを追加したいという状況です。参考までに-DOMDocumentに初めて取り組む。xmlが次のようになっているとしましょう

<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>要素を取得します。<ds>この場合、長さは6になります。ただし、各<cdp_prep>要素の2番目にBeforeを挿入しようとしています。<ds>私の問題は、「/ rrd / rra / cdp_prep」でクエリを実行した場合、すべての要素の2番目の要素でinsertBeforeをターゲットにするにはどうすればよい<cdp_prep>ですか?

4

2 に答える 2

1

childXPathの軸を使用して、2番目のds子を選択できます。

/rrd/rra/cdp_prep/child::ds[2]
于 2012-05-04T22:46:24.817 に答える
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();
于 2012-05-05T00:22:48.640 に答える