我有一个带有html内部聊天的dom元素,其中包含一些我想删除的html元素,同时仍保留一些可以正常使用的标记。
我尝试遍历所有子元素的子元素并删除那些需要删除的元素
foreach ($node->getElementsByTagName('*') as $element)
if ($element->nodeName != 'br')
$node->removeChild($element);
但是这会抛出一个Not Found Error异常,但是没有被捕获会导致致命的错误。 我该如何解决这个问题?
答案 0 :(得分:2)
使用以下代码删除节点:
$element->parentNode->removeChild($element);
答案 1 :(得分:2)
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
是一个活动列表,因此我们无法在删除时迭代它。 (虽然我们可以向后迭代它。)