如何使用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 [.. .]如果你想更深入地搜索).

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...