PHP DOM - 计算子节点?

mic*_*chi 9 php dom

HTML代码段#1

<div>
</div>
<div>
    <h1>headline</h1>
</div>
Run Code Online (Sandbox Code Playgroud)

HTML代码段#2

<div></div>
<div><h1>headline</h1></div>
Run Code Online (Sandbox Code Playgroud)

PHP代码

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

foreach ($divs as $div) echo $div->childNodes->length,"<br />";
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

编辑:
正如Silkfire所说,空白空间被视为文本节点.我设置

$doc->preserveWhiteSpace = false;
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

nic*_*ass 5

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

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

print $count;
Run Code Online (Sandbox Code Playgroud)

使用xpath:

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

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

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

foreach($textNodes as $node)
  if(trim($node->wholeText) === '')
    $node->parentNode->removeChild($node);
Run Code Online (Sandbox Code Playgroud)