我是这样一种情况:我想在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。但是,我尝试在每个<cdp_prep>元素的第二个<ds>上执行insertBefore。我的问题是,如果我查询"/rrd/rra/cdp_prep",我如何在第二个<ds>元素上为每个<cdp_prep>元素定位insertBefore?
发布于 2012-05-05 08:22:49
基本步骤是:
insertBefore引用节点的节点。您可以使用子轴和位置测试来实现此目的:cdp_prep/child::ds[position()=2],可以将其缩写为cdp_prep/ds[2].示例:
$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-05 06:46:25
可以在XPath中使用child轴选择第二个ds子对象:
/rrd/rra/cdp_prep/child::ds[2]https://stackoverflow.com/questions/10454383
复制相似问题