我正在尝试对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查询?
看起来你正在尝试将CSS选择器与XPath混合使用.您希望使用谓词([…])查看class属性的值.
原文链接:https://www.f2er.com/php/134103.html例如,你的//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 [.. .]如果你想更深入地搜索).