Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.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'替换DOMNode;s的DOM类_Php_Dom_Domdocument - Fatal编程技术网

用PHP'替换DOMNode;s的DOM类

用PHP'替换DOMNode;s的DOM类,php,dom,domdocument,Php,Dom,Domdocument,我正在学习使用PHP中可用的DOM*类,并注意到(我认为是)测试中的一个不规则之处 给定此文档,ZuqML\u test\u 100.html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:zuq="http

我正在学习使用PHP中可用的DOM*类,并注意到(我认为是)测试中的一个不规则之处

给定此文档,
ZuqML\u test\u 100.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:zuq="http://localhost/~/zuqml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
    <h1>
        <zuq:data name="siteHeader" />
    </h1>
    <h2>
        <zuq:data name="pageHeaderName" />
        <span>&nbsp;|&nbsp;</span>
        <zuq:data name="pageHeaderTitle" />
    </h2>
    <zuq:region name="post">
        <zuq:param name="onEmpty">
            <div class="post noposts">
                <p>There are no posts to show at this time.</p>
            </div>
        </zuq:param>
        <div class="post">
            <h3><zuq:data name="postHeader" /></h3>
            <p>
                <zuq:data name="postText">
                    <zuq:format type="trim">
                        <zuq:param name="length">300</zuq:param>
                        <zuq:param name="append">
                            <a>
                                <zuq:attr name="href">
                                    ./?action=viewpost&amp;id=<zuq:data name="postId" />
                                </zuq:attr>
                                <zuq:data name="postAuthor" />
                            </a>
                        </zuq:param>
                    </zuq:format>
                </zuq:data>
            </p>
        </div>
    </zuq:region>
</body>
</html>
它可以正常工作,但是我的输出仍然包含
节点,如下所示:

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:zuq="http://ichorworkstudios.no-ip.org/~/zuqml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

        <h1>
        foo
    </h1>

    <h2>
        <zuq:data name="pageHeaderName"></zuq:data>
        <span>&mdash;</span>
        foo
    </h2>

    <zuq:region name="post">
        <zuq:param name="onEmpty">
                <div class="post noposts">
                <p>There are no posts to show at this time.</p>
            </div>
        </zuq:param>
        <div class="post">
                <h3><zuq:data name="postHeader"></zuq:data></h3>
            <p>
                foo
                </p>
        </div>
    </zuq:region>

</body>
</html>

无标题文件
福
&mdash;
福
目前没有可显示的帖子


为什么会有一些
节点落在后面?

我认为这与迭代的方式有关。在对结果列表进行迭代时,您正在更改它,因此它最终会崩溃(副作用)。尝试将循环更改为:

$nodes = $root->getElementsByTagNameNS($root->lookupNamespaceURI('zuq'), 'data');
$i = $nodes->length - 1;
while ($i >= 0) {
    $node = $nodes->item($i);
    $node->parentNode->replaceChild(
        $node->ownerDocument->createTextNode('foo'), 
        $node
    );
    $i--;
}

基本上,它只是在节点列表上向后迭代,这样当节点被删除时,它们从末尾而不是开始被删除…

ircmaxell提供的解释是

在对结果列表进行迭代时,您正在更改结果列表

是正确的,不过我想我会给它添加更多的细节,这样你就可以理解为什么会发生这种情况

以下是您的代码在运行时所做的操作

开始时,节点列表中将有七个节点

第一个是

<zuq:data name="siteHeader"></zuq:data>
当当前位置为0且您从文档中删除该节点时,您将得到如下列表

0 pageHeaderName
1 pageHeaderTitle
n …
但是,您仍然处于位置0,因此,当您转到节点列表中的下一个元素时,您将跳过新位置0处的节点。你直接去pageHeaderTitle,留下pageHeaderName未处理

移除pageHeaderTitle后,节点计数降至5,使

<zuq:data name="pageHeaderName"></zuq:data>

当前位置的新元素。因此,将删除下一个节点

<zuq:data name="pageHeaderTitle"></zuq:data>
<zuq:data name="postText">
    <zuq:format type="trim">
    <zuq:param name="length">300</zuq:param>
        <zuq:param name="append">
        <a>
        <zuq:attr name="href">
        ./?action=viewpost&amp;id=
        <zuq:data name="postId"></zuq:data>
        </zuq:attr>
        <zuq:data name="postAuthor"></zuq:data>
        </a>
    </zuq:param>
    </zuq:format>
</zuq:data>

300
如您所见,这里还有两个zuq:数据元素。因此,节点计数将下降到2(5-1当前节点-2个子节点)

之后,节点列表上的迭代结束,剩下

<zuq:data name="postHeader"></zuq:data>



仍在文档中。

给出了
致命错误:无法在第25行的F:\Work\code\gordonoheim\sandbox\newfile.php中将DOMNodeList类型的对象用作数组
,除非您执行
$nodes->item($i)
感谢ircmaxell;但复制粘贴未成功,退出时出现
致命错误:无法将DOMNodeList类型的对象用作数组
@戈登;戈登:谢谢,我忘了那个了。假设迭代器实现arrayaccess是一个简单的错误。愚蠢的错误。。。谢谢你的收听。谢谢戈登,你的全面解释,非常感谢。我一定会记住这一点。
<zuq:data name="pageHeaderName"></zuq:data>
<zuq:data name="postText">
    <zuq:format type="trim">
    <zuq:param name="length">300</zuq:param>
        <zuq:param name="append">
        <a>
        <zuq:attr name="href">
        ./?action=viewpost&amp;id=
        <zuq:data name="postId"></zuq:data>
        </zuq:attr>
        <zuq:data name="postAuthor"></zuq:data>
        </a>
    </zuq:param>
    </zuq:format>
</zuq:data>
<zuq:data name="postHeader"></zuq:data>
<zuq:data name="pageHeaderName"></zuq:data>