DOMDocument分组节点,错误在哪里?如何调试 LibXML2 的“未找到错误”


DOMDocument grouping nodes, where the bug? How to debug a 'Not Found Error' of LibXML2?

如何调试LibXML2的"未找到错误"?该函数(简化/重写以在此处发布)按标签对节点列表进行分组。

  function groupList(DOMNodeList &$list,$tag,&$dom) {
        $list = iterator_to_array($list); // to save itens
        $T = $dom->createElement($tag);
        $N = count($list);
        if ($N && $list[0]->nodeType==1) {
              for($i=0; $i<$N; $i++) 
                    $T->appendChild( $list[$i] );
                   // here print $dom->saveXML($lista[0]) shows the expected XML.
              $list[0]->parentNode->replaceChild($T, $list[0]);
    //Fatal error:  ... 'DOMException' with message 'Hierarchy Request Error'
    // also error with $dom->documentElement->replaceChild( $T, $list[0] );  
    // where error is: ... 'DOMException' with message 'Not Found Error'
              for($i=1; $i<$N; $i++)
                    $list[$i]->parentNode->removeChild($list[$i]);
        }//if
        return $N;
  }//func

编辑1:$list[0]->parentNode->replaceChild($T, $list[0]);错误是"层次结构请求错误"。 调试print $dom->saveXML($list[0])显示预期的 XML。


编辑2:通过输入和输出说明

输入

  <root><b>10</b><a/><a>1</a><b>20</b><a>2</a></root>

groupList($dom->getElementsByTagName('a'),'G')的预期产出

  <root><b>10</b>
     <G><a/><a>1</a><a>2</a></G>
  <b>20</b></root>

是一个错误(?...解决方案:要使用相同的算法,我们需要克隆或导入节点,

  function groupList(DOMNodeList &$list,$tag,&$dom) {
        $list = iterator_to_array($list); // to save itens
        $d2 = new DOMDocument;
        $T = $d2->createElement($tag);
        $N = count($list);
        if ($N && $list[0]->nodeType==1) {
              for($i=0; $i<$N; $i++) 
                  $T->appendChild( $d2->importNode($list[$i], true) );
              $dom->documentElement->replaceChild(
                    $dom->importNode($T, true),   $list[0]
              );
              for($i=1; $i<$N; $i++)
                    $list[$i]->parentNode->removeChild($list[$i]);
        }//if
        return $N;
  }//func

但是,我不明白为什么(!),一种没有iterator_to_array的基本算法可以工作(!好吧,接近工作正常(返回$dom错误),

 function groupList2(DOMNodeList &$list,$tag,&$dom) {
       $n = $list->length;
       if ($n && $list->item(0)->nodeType==1) {
          $T = $dom->createElement($tag);
              for($i=0; $i<$n; $i++) 
                 $T->appendChild( clone $list->item($i) );
              $dom->documentElement->replaceChild( $T,$list->item(0) );
              for($i=0; $i<$n; $i++)
             if ($i) $list->item($i)->parentNode->removeChild($list->item($i));
        }//if
        return $n;
  }//func

返回

  <root><b>10</b><G><a/><a>2</a></G><b>20</b><a>2</a></root>