【问题标题】:xpath Query: only retrieve value of grandchildxpath查询:只检索孙子的值
【发布时间】:2013-08-19 11:25:18
【问题描述】:

我想在下面的 test.html 中使用 xpath 查询仅检索一次“测试”

<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] 节点中也会打印“Testing”?我希望它只在 [strong] 节点中检索“测试”。

【问题讨论】:

  • 因为孙子将是/./., //*== 任何深度的任何子。

标签: php xpath


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    只有孙辈使用/html/body/div[2]/*/*

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-28
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多