PHP DOMDocument - InsertBefore多次

时间:2012-05-04 18:39:38

标签: php xml domdocument

我想在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>元素。在这种情况下,我的长度为6.但是,我试图在每个<ds>元素的第二个<cdp_prep>上插入。我的问题是,如果我查询“/ rrd / rra / cdp_prep”,我如何针对每个<ds>元素在第二个<cdp_prep>元素上定位insertBefore?

2 个答案:

答案 0 :(得分:1)

您可以在XPath中使用child轴来选择第二个ds子项:

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

答案 1 :(得分:0)

基本程序是:

  1. 选择要用作insertBefore参考节点的节点。您可以使用子轴和位置测试来获得此结果:cdp_prep/child::ds[position()=2],可以缩写为cdp_prep/ds[2]
  2. 准备要插入的节点。
  3. 对于每个匹配的引用节点,克隆要插入的节点,然后插入它。
  4. 示例:

    $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();