DOM正在删除选定的子节点


DOM removing selected child nodes

我有一个dom元素,里面有html。聊天包含一些我想删除的html元素,同时仍然保留一些可以使用的标签。

我尝试迭代子元素——所有子元素,并删除那些需要删除的

foreach ($node->getElementsByTagName('*') as $element)
    if ($element->nodeName != 'br')
        $node->removeChild($element);

但这会引发一个"未发现错误"异常,未被捕获会导致致命错误。我该如何解决这个问题?

使用以下命令删除节点:

$element->parentNode->removeChild($element);

getElementsByTagName('*')查找所有派生元素,而不是子元素。因此,您要删除的某些$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是一个活动列表,所以我们不能在删除时向前迭代它。(尽管我们可以向后迭代。)