如何在php中删除子节点


How to remove child nodes in php

我在PHP中使用DOMDocument类来删除'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',消息'Not Found Error' inC:'xampp'htdocs'test'dum2.php:70堆栈跟踪:#0C: ' xampp '根' test ' dum2.php (70):DOMNode->removeChild(Object(DOMElement)) #1 {main}抛出C:'xampp'htdocs'test'dum2.php第70行

我已经挣扎了很长一段时间了,但无法找出问题是什么,因为我是新的使用这个DOMDocument类。'body'元素确实包含子元素!

一个节点只能有一个父节点。所以我假设当你调用$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