微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用PHP在DOMElements上执行XPath查询?

我正在尝试对DOMElements进行Xpath查询,但它似乎不起作用.这是代码
<html>
    <div class="test aaa">
        <div></div>
        <div class="link">contains a link</div>
        <div></div>
    </div>
    <div class="test bbb">
        <div></div>
        <div></div>
        <div class="link">contains a link</div>
    </div>
</html>

我正在做的是这样的:

$dom = new DOMDocument();
$html = file_get_contents("file.html");
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$entries = $xpath->query("//div[contains(@class,'test')]");
if (!$entries->length > 0) {
    echo "nothing\n";
} else {
  foreach ($entries as $entry) {
      $link = $xpath->query('/div[@class=link]',$entry);
      echo $link->item(0)->nodeValue;
      // => PHP Notice:  Trying to get property of non-object
  }
}

一切正常,$xpath->查询(‘/ div [@ class = link],$entry);.我不知道如何在特定的DOMElement($entry)上使用Xpath.

如何在DOMElement上使用xpath查询

看起来你正在尝试将CS​​S选择器与XPath混合使用.您希望使用谓词([…])查看class属性的值.

例如,你的//div.link可能看起来像// div [contains(concat(”,normalize-space(@class),”),’link’)].

其次,在循环中,您尝试使用上下文节点进行查询,然后通过使用绝对位置路径(以斜杠开头)忽略它.

已更新以反映对问题的更改:

你的第二个XPath表达式(/ div [@ class = link])仍然是a)绝对的,而b)的条件不正确.您希望使用具有字符串值link的class属性来请求相对于指定上下文节点($entry)的匹配元素.

所以/ div [@ class = link]应该变成div [@ class =“link”],它搜索$entry元素的子元素(使用.// div […]或descendant :: div [.. .]如果你想更深入地搜索).

原文地址:https://www.jb51.cc/php/134103.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐