gpt4 book ai didi

php - 用 PHP 的 DOM 类替换 DOMNode

转载 作者:行者123 更新时间:2023-12-03 22:57:28 24 4
gpt4 key购买 nike

我正在学习使用 PHP 中提供的 DOM* 类,并且注意到(我认为是)我的测试中存在不规则之处。

鉴于此文档,ZuqML_test_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>

我正在尝试替换所有 <zuq:data />具有值 foo 的简单文本节点的节点。我使用以下代码片段来执行此操作:

$root = new DOMDocument();
@$root->load('ZuqML_test_100.html');

foreach($root->getElementsByTagNameNS($root->lookupNamespaceURI('zuq'), 'data') as $node){
$node->parentNode->replaceChild($node->ownerDocument->createTextNode('foo'), $node);
}

echo $root->saveXML();

它有点有效,但是我的输出似乎仍然包含 <zuq:data />节点,如下所示:

<?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>

为什么有些<zuq:data />节点被抛在后面?

最佳答案

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

$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--;
}

基本上,它只是向后迭代节点列表,因此当删除节点时,它们是从末尾而不是开头删除......

关于php - 用 PHP 的 DOM 类替换 DOMNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4615661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com