微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php DOMDocument nodeName属性返回’#text’与nodeName

我想提取html页面的body的内容以及其子节点的tagNames.我已经采取了一个这样的例子:
<html>
<head></head>
<body>
<h1>This is H1 tag</h1>
<h2>This is H2 tag</h2>
<h3>This is H3 tag</h3>
</body>
</html>

我已经实现了下面的PHP代码,它的工作正常.

$d=new DOMDocument();
$d->loadHTMLFile('file.html');
$l=$d->childNodes->item(1)->childNodes->item(1)->childNodes;
for($i=0;$i<$l->length;$i++)
{
echo "<".$l->item($i)->nodeName.">".$l->item($i)->nodeValue."</".$l->item($i)->nodeName.">";
}

这个代码工作得很好,但是当我尝试使用foreach循环而不是for循环时,nodeName属性返回’#text’与每个实际的nodeName.
这是代码

$l=$d->childNodes->item(1)->childNodes->item(1)->childNodes;
foreach ($l as $li) {
    echo $li->childNodes->item(0)->nodeName."<br/>";
}

为什么这样?

在DOM中,一切都是“节点”.不只是元素(标签);元素之间的注释和文本(即使只是你的例子中的空格或换行符)也是节点.由于文本节点没有实际的节点名称,所以它被#text替代,表示它是一种特殊类型的节点.

显然,当使用item方法手动选择子节点时,文本节点被省略,但在遍历DOMNodeList时包含.我不知道为什么这个类的行为是这样的,别人会不得不回答这个问题.

在nodeName和nodeValue旁边,DOMNode也有一个nodeType属性.通过根据certain constants检查此属性,您可以确定节点的类型,从而过滤掉不需要的节点.

原文地址:https://www.jb51.cc/php/131242.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐