2013-08-17 127 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]/*/*