【问题标题】:How can I execute XPath queries on DOMElements using PHP?如何使用 PHP 在 DOMElements 上执行 XPath 查询?
【发布时间】:2011-08-21 05:14:09
【问题描述】:

我正在尝试对 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-&gt;query('/div[@class=link], $entry); 之前一切正常。我不知道如何在特定的 DOMElement ($entry) 上使用 Xpath。

如何在 DOMElement 上使用 xpath 查询?

【问题讨论】:

  • 除非您提供评估这些 XPath 表达式的 XML 文档(尽可能小),否则无法给出一个好的答案(猜测除外)。您可能有一个默认命名空间,这可以解释结果。另外,请注意//div.link 是一个absolute XPath 表达式,而您想针对每个$entry 评估一个relative XPath 表达式。所以,宁愿是:.//div.link
  • 我假设您的 HTML 是 XHTML 并且完全有效的 XHTML?
  • @Orbling:不用了,他用的是loadHTML方法。
  • @Jon:好吧,如果有无效位,它仍然会生成一批警告。
  • @Dimitre:停止从您不喜欢的问题中删除 xpath 标签。

标签: php dom xpath element


【解决方案1】:

看起来您正在尝试将 CSS 选择器与 XPath 混合使用。您想使用谓词 ([...]) 查看 class 属性的值。

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

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

更新以反映问题的变化:

您的第二个 XPath 表达式 (/div[@class=link]) 仍然是 a) 绝对的,并且 b) 条件不正确。您想要请求与指定上下文节点 ($entry) 相关的匹配元素,其中 class 属性的 字符串值 为 link。

所以/div[@class=link] 应该变成div[@class="link"] 之类的东西,它会搜索$entry 元素的子元素(如果您想更深入地搜索,请使用.//div[...] 或descendant::div[...])。

【讨论】:

  • 我的错误确实是不正确的条件,“链接”周围缺少引号。谢谢。
猜你喜欢
  • 2013-05-19
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2016-06-07
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多