首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP DOMDocument - InsertBefore多次

PHP DOMDocument - InsertBefore多次
EN

Stack Overflow用户
提问于 2012-05-05 02:39:38
回答 2查看 838关注 0票数 0

我是这样一种情况:我想在XML文件中的多个位置添加相同的内容。仅供参考-第一次处理DOMDocument。假设xml看起来像这样

代码语言:javascript
复制
<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",我如何在第二个<ds>元素上为每个<cdp_prep>元素定位insertBefore?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-05 08:22:49

基本步骤是:

  1. 选择要用作insertBefore引用节点的节点。您可以使用子轴和位置测试来实现此目的:cdp_prep/child::ds[position()=2],可以将其缩写为cdp_prep/ds[2].
  2. Prepare要插入的节点。
  3. 对于每个匹配的引用节点,克隆要插入的节点,然后将其插入。

示例:

代码语言:javascript
复制
$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
EN

Stack Overflow用户

发布于 2012-05-05 06:46:25

可以在XPath中使用child轴选择第二个ds子对象:

代码语言:javascript
复制
/rrd/rra/cdp_prep/child::ds[2]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10454383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档