我想在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?
答案 0 :(得分:1)
您可以在XPath中使用child
轴来选择第二个ds子项:
/rrd/rra/cdp_prep/child::ds[2]
答案 1 :(得分:0)
基本程序是:
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();