Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP DOMDocument-多次插入之前_Php_Xml_Domdocument - Fatal编程技术网

PHP DOMDocument-多次插入之前

PHP DOMDocument-多次插入之前,php,xml,domdocument,Php,Xml,Domdocument,我希望在一个XML文件的多个位置添加相同的内容。仅供参考-首次提交文件。 假设xml看起来像 <rrd> <rra> <cdp_prep> <ds> <value>nan</value> </ds> <ds> <value>nan</value> </ds> &l

我希望在一个XML文件的多个位置添加相同的内容。仅供参考-首次提交文件。 假设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”)
元素。在这种情况下,长度为6。但是,我正在尝试在每个
元素的第二个
上插入before。我的问题是,如果我查询“/rrd/rra/cdp_prep”,我如何针对每个
元素的第二个
元素的insertBefore?

您可以使用XPath中的
子元素
轴选择第二个ds子元素:

/rrd/rra/cdp_prep/child::ds[2]
基本程序是:

  • 选择要用作
    insertBefore
    参考节点的节点。您可以使用子轴和位置测试来实现这一点:
    cdp\u prep/child::ds[position()=2]
    ,可以缩写为
    cdp\u 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();
    

    xml无效。。您是想关闭
    ds
    元素吗?是的,对不起。星期五下午。。。并在键盘上敲击头部:)