getElementsByTagName('*')
находит все потомки элементов, а не child элементов.Таким образом, некоторые из $element
, которые вы хотите удалить, не являются потомками $node
, отсюда и ошибка.
Я не уверен на 100%, каково ваше намерение, но, скорее всего, вы просто хотите удалитьопределенные непосредственные дети.В этом случае выполните следующие действия:
$nodestoremove = array();
foreach ($node->childNodes as $n) {
if ($n->nodeType===XML_ELEMENT_NODE and $n->nodeName!=='br') {
$nodestoremove[] = $n;
}
}
foreach ($nodestoremove as $n) {
$node->removeChild($n);
}
unset($nodestoremove); // so nodes can be garbage-collected
echo $node->C14N(); // xml fragment after removal
Обратите внимание, что мы делаем два прохода: один для идентификации удаляемых узлов и второй проход для удаления.Это потому, что childNodes
является активным списком, поэтому мы не можем перебирать его вперед при удалении.(Хотя мы могли бы повторить это задом наперед.)