Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除php中的子节点_Php_Dom - Fatal编程技术网

如何删除php中的子节点

如何删除php中的子节点,php,dom,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

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

未捕获的异常“DomeException”,在中显示消息“Not Found Error” C:\xampp\htdocs\test\dum2.php:70堆栈跟踪:#0 C:\xampp\htdocs\test\dum2.php(70): DOMNode->removeChild(对象(domeElement))#1{main}被抛出 第70行的C:\xampp\htdocs\test\dum2.php


我已经为此挣扎了很长一段时间,但无法找出问题所在,因为我对使用这个
DOMDocument
类还不熟悉。“body”元素不包含子元素

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

意思是:您不需要删除子项,因为它已被删除

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

更新:事实上,如果有多个元素节点,并非所有节点都会移动:

要解决此问题,请尝试按相反顺序迭代子元素:

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

我已经试过了,而且效果不错。子节点不会从body元素中删除…即使在我删除
$wrapperDiv->appendChild($child)时也不会删除
..@Salman:你是如何测试是否有孩子的?我已经编辑了相关的代码。html文件包含div和img标记,…hmmm…这可能是因为我使用loadHTMLFile吗?哦,请尝试放置至少两个child n,然后查看它是否适用于u或nt!!我想知道,如果你在孩子身上迭代,你怎么会不允许改变他们。