PHP DOM - 计算子节点?

时间:2013-05-09 21:02:52

标签: php dom

HTML代码段<1

<div>
</div>
<div>
    <h1>headline</h1>
</div>

HTML代码段<2

<div></div>
<div><h1>headline</h1></div>

PHP代码

$doc = new DOMDocument();
$doc->loadHTML($x);
$xpath = new DOMXpath($doc);
$divs = $xpath->query("//div");

foreach ($divs as $div) echo $div->childNodes->length,"<br />";

使用$x =代码段#1输出
    1
    3

使用$x =代码段#2输出
    0
    1

参见工作演示:http://codepad.viper-7.com/11BGge

我的问题
  这怎么可能?   2.如何使用DOM正确计算子节点?

修改
正如Silkfire所说,空白空间被认为是一个文本节点。我设置了

$doc->preserveWhiteSpace = false;

但结果仍然相同:http://codepad.viper-7.com/bnG5io

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

只计算循环中的非文本节点:

$count = 0;
foreach($div->childNodes as $node)    
  if(!($node instanceof \DomText))      
    $count++;

print $count;

使用xpath:

$nodesFromDiv1 = $xpath->query("//div[1]/*")->length;
$nodesFromDiv2 = $xpath->query("//div[2]/*")->length;

要删除空文本节点,preserveWhiteSpace=false不起作用时(正如我在聊天中所建议的那样):

$textNodes = $xpath->query('//text()');

foreach($textNodes as $node)
  if(trim($node->wholeText) === '')
    $node->parentNode->removeChild($node);

答案 1 :(得分:3)

空格被视为节点,因为它是 text()节点(DOMText)。

您可以通过更改foreach循环来完成此工作:

foreach ($divs as $div) {
    echo $div->childNodes->length - $xpath->query('./text()', $div)->length, '<br>';
}

答案 2 :(得分:0)

Firefox,Chrome和大多数其他浏览器会将空白空格或新行视为文本节点,Internet Explorer不会。检查 Here