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