-1

如何调试 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

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


Edit2:由 INPUT 和 OUTPUT 说明

输入

  <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>
4

1 回答 1

0

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

  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>
于 2013-11-01T20:21:19.160 回答