【问题标题】:PHP DOMDocument - InsertBefore multiple timesPHP DOMDocument - InsertBefore 多次
【发布时间】:2012-05-05 08:27:38
【问题描述】:

我想在 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-&gt;query("/rrd/rra/cdp_prep/ds"); 之类的东西,那么我将获得所有 &lt;ds&gt; 元素。在这种情况下,我的长度为 6。但是,我试图在每个 &lt;cdp_prep&gt; 元素的第二个 &lt;ds&gt; 上插入之前。我的问题是,如果我查询“/rrd/rra/cdp_prep”,我如何针对每个&lt;cdp_prep&gt; 元素的第二个&lt;ds&gt; 元素定位insertBefore?

【问题讨论】:

  • xml 无效.. 你的意思是关闭ds 元素吗?
  • 是的,抱歉。星期五下午...在键盘上敲打头:)

标签: php xml domdocument


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    基本流程是:

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

    【讨论】:

      猜你喜欢
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 2013-06-16
      • 2011-02-20
      • 1970-01-01
      • 2011-07-26
      相关资源
      最近更新 更多