php DOMDocument nodeName 属性返回带有 nodeName 的“#text”

Posted

技术标签:

【中文标题】php DOMDocument nodeName 属性返回带有 nodeName 的“#text”【英文标题】:php DOMDocument nodeName property returning '#text' with the nodeName 【发布时间】:2012-03-24 07:50:38 【问题描述】:

我想提取 html 页面的正文内容及其子页面的 tagNames。我采用了这样的示例 html:

<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 属性会返回带有每个实际 nodeName 的“#text”。 这是代码

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

为什么会这样?

【问题讨论】:

【参考方案1】:

当我遇到此问题时,通过执行以下操作已解决。

$xmlDoc = new DOMDocument();
$xmlDoc->preserveWhiteSpace = false; // important!

您可以追踪您的 $node->nodeType 以查看差异。即使只有一个节点(子节点),我也会得到 3、1、3。关闭空白,现在我只得到 1。

GL。

【讨论】:

【参考方案2】:

在 DOM 中,一切都是“节点”。不仅仅是元素(标签);元素之间的 cmets 和文本(即使只是空格或换行符,在您的示例中似乎就是这种情况)也是节点。由于文本节点没有实际的节点名称,因此将其替换为 #text 以表明它是一种特殊类型的节点。

显然,使用item 方法手动选择子节点时会忽略文本节点,但在迭代DOMNodeList 时会包含文本节点。我不确定这个类为什么会这样,其他人必须回答这个问题。

除了nodeNamenodeValueDOMNode 还具有nodeType 属性。通过对照certain constants 检查此属性,您可以确定节点的类型,从而过滤掉不需要的节点。

【讨论】:

发现可以用nextElementSibling解决DOM家族的nextSibling争吵!该死的 ↵ 和 【参考方案3】:

我来晚了一点,但对我来说最好的解决方案是不同的。问题在于 TEXT 节点不知道它的名称,但他的父节点这样做了,您只需要知道它就是向他的父节点询问 nodeValue 以获取密钥。

$dom = new DOMDocument();
$dom->loadXML($stringXML);
$valorizador = $dom->getElementsByTagName("tagname");
foreach ($valorizador->item(0)->childNodes as $item) 
  $childs = $item->childNodes;
  $key = $item->nodeName;
  foreach ($childs as $i) 
     echo $key." => ".$i->nodeValue. "\n";
  

【讨论】:

以上是关于php DOMDocument nodeName 属性返回带有 nodeName 的“#text”的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中使用 DOMDocument 缩进

PHP DOMDocument 添加了额外的标签

在 PHP 中从 DOMNode 创建 DOMDocument

PHP 4 中的新 DOMDocument()

PHP DOMDocument 丢失

这是 PHP 的 DOMDocument 库中的错误吗?