php - php中如何删除子节点

标签 php dom

我在 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); 处它给了我错误

Uncaught exception 'DOMException' with message 'Not Found Error' in C:\xampp\htdocs\test\dum2.php:70 Stack trace: #0 C:\xampp\htdocs\test\dum2.php(70): DOMNode->removeChild(Object(DOMElement)) #1 {main} thrown in C:\xampp\htdocs\test\dum2.php on line 70

我已经为此苦苦挣扎了很长一段时间,但无法弄清楚问题是什么,因为我刚开始使用这个 DOMDocument 类。 “body”元素确实包含子元素!

最佳答案

一个节点只能有一个父节点。所以我假设当您调用 $wrapperDiv->appendChild($child); 时,$child 不再是 $body 的子级,并且因此 $body->removeChild($child); 会抛出错误。

含义:您不需要删除子项,因为它已经被删除了。

另一方面,如果您确实想删除子项而不将它们附加到其他位置,则删除 $wrapperDiv->appendChild($child);

更新:确实,如果有多个 Element 节点,则并非所有节点都被移动: 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

关于php - php中如何删除子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7821164/

相关文章:

php - 登录时检查用户是否为admin

php - 使用 PHP 和 MySQL 一次一个请求

javascript - 克隆完整表格并作为表单值提交

javascript - 输入集中但不可输入

jquery - 如何检查元素是否不是第一个 child ?

php - Laravel 5.1 - barryvdh/laravel-dompdf,PDF 文件下载不正常

php - try{}catch(){} 中 (Exception $e) 和 (\Exception $e) 的区别

java - 从dom列表到xml文件的xml解析

css - 无法在 Extjs 中为 chrome 动态应用背景面板图像

jquery - 如何使用 jQuery 获取特定元素后找到的第一个元素 "further in the DOM"