Иногда кажется, что возвращенный DOMNodeList не является живым.
Он жив при использовании доступа как childNodes
$children=$doc->getElementsByTagName('body')->item(0)->childNodes;
echo $children->length; //7
$children->item(0)->parentNode->removeChild($children->item(0));
echo $children->length; //6! list is live!
Но в других случаях список не в прямом эфире …
$xpath=new DOMXPath($doc);
$nodes=$xpath->query("//p");
echo $nodes->length; // 7
$nodes->item(0)->parentNode->removeChild($nodes->item(0));
echo $nodes->length; // still 7? Not live.
XPath, кажется, главный виновник. Но зачем возвращать DOMNodeList, если он не живой? Почему бы не просто массив в этой точке?
Задача ещё не решена.
Других решений пока нет …