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

4

2 回答 2

1

您可以使用childXPath 中的轴来选择第二个 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 回答