Как удалить дочерние узлы в php - PullRequest
2 голосов
/ 19 октября 2011

Я использую класс DOMDocument в PHP, чтобы удалить все дочерние узлы элемента 'body'.Мой код выглядит следующим образом:

$doc=new DOMDocument();
$doc->loadHTMLFile("a.html");

$wrapperDiv=$doc->createElement('div');
$wrapperDiv->setAttribute('class','wrapper');

$body= $doc->getElementsByTagName('body')->item(0);
foreach( $body->childNodes as $child)
{

        if($child->nodeName != "#text")
        {
            $wrapperDiv->appendChild($child);
            $body->removeChild($child);
        }

} 

$body->appendChild($wrapperDiv);
$doc->saveHTMLFile('aaa.html');

на $body->removeChild($child);. Это дает мне ошибку

Необработанное исключение «DOMException» с сообщением «Ошибка не найдена» в C: \ xampp \ htdocs\ test \ dum2.php: 70 Трассировка стека: # 0 C: \ xampp \ htdocs \ test \ dum2.php (70): DOMNode-> removeChild (Object (DOMElement)) # 1 {main}, брошенный в C: \ xampp\ htdocs \ test \ dum2.php в строке 70

Я уже давно борюсь с этим, но не могу понять, в чем проблема, поскольку я новичок в использовании этого DOMDocument учебный класс.Элемент body содержит дочерние элементы!

1 Ответ

3 голосов
/ 19 октября 2011

Узел может иметь только одного родителя. Поэтому я предполагаю, что когда вы вызываете $wrapperDiv->appendChild($child);, $child больше не является потомком $body и, следовательно, $body->removeChild($child); выдает ошибку.

Значение: вам не нужно удалять ребенка, так как он уже удален.

Если, с другой стороны, вы действительно хотите удалить детей и никуда не добавлять их, удалите $wrapperDiv->appendChild($child);.

Обновление: Действительно, кажется, что если есть несколько узлов Элемента, не все узлы перемещаются: http://codepad.org/8udqSNMj

Чтобы это исправить, попробуйте перебрать дочерние элементы в обратном порядке:

$children = $body->childNodes;
for($i = $children->length; $i--;) {
    $child = $children->item($i);
    if($child->nodeName != "#text") {
        $wrapperDiv->appendChild($child);
    }
} 

http://codepad.org/LtuJN2ZT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...