DOM удаляет выбранные дочерние узлы - PullRequest
0 голосов
/ 22 января 2012

У меня есть элемент dom с html внутри чата, который содержит некоторые элементы html, которые я хотел бы удалить, но при этом сохранил некоторые теги, которые в порядке.

Я пытаюсь перебрать все дочерние элементы всех дочерних элементов и удалитьте, которые должны быть удалены

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

Но это вызывает исключение Not Found Error, которое не может быть перехвачено и приводит к фатальной ошибке.Как бы я решил эту проблему?

Ответы [ 2 ]

2 голосов
/ 22 января 2012

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 является активным списком, поэтому мы не можем перебирать его вперед при удалении.(Хотя мы могли бы повторить это задом наперед.)

2 голосов
/ 22 января 2012

Используйте следующее вместо этого, чтобы удалить узел:

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