2013-08-17 72 views
1

的价值我想使用XPath查询检索“测试”只有一次,在下面的test.htmlXPath查询:只检索孙子

<html> 
    <body> 
     <div class="test1"></div> 
     <div class="test2"> 
      <div><strong>Testing</strong></div> 
     </div> 
    </body> 
</html> 

这里是PHP代码我用来检索内容。

$uri='test.html'; 
$doc = new DOMDocument('1.0','utf-8'); 
$doc->loadHTMLFile($uri); 
$xpath= new DOMXPath($doc); 
$path="/html/body/div[2]//*"; 
$elements = $xpath->query($path); 

if(!is_null($elements)){ 
    foreach($elements as $element){ 
     echo '<br>['.$element->nodeName.']'; 
     $nodes = $element->childNodes; 
     foreach($nodes as $node){ 
      $nodeValue=$node->nodeValue; 
      echo $nodeValue; 
     } 
    } 
} 

这是我得到的结果。

[div] Testing 
[strong] Testing 

为什么即使在[div]节点中也会打印“测试”?我希望它只在[强]节点中检索“测试”。

+0

因为孙子是'/./。','// *'在任何深度==任何孩子。 – Wrikken

回答

0

这就是它的工作原理 - 父节点的nodeValue将始终包含其子节点的nodeValue

nodeValue不太适合你的目标。您应该在其子项中获取文本节点。看到这个问题:Getting node's text in PHP DOM

0

您的XPath /html/body/div[2]//*返回div[2]的所有后代,包括子节点和孙子节点。

要获得唯一的孙子使用/html/body/div[2]/*/*