我正在尝试选择所有 HTML 节点,其中该节点包含名称以“on”开头的属性。
这就是我的 xpath:
//*[@*[starts-with(name(), 'on')]]
使用上述 xpath 和 html
SelectNodes
调用 <div onclick="alert('test');"></div>
时,我返回 null。
var document = new HtmlDocument();
document.LoadHtml("<div onclick=\"alert('test');\"></div>");
var nodes = document.DocumentNode.SelectNodes("//*[@*[starts-with(name(), 'on')]]");
我已经在几个 xpath 测试站点上测试了 xpath(https://www.freeformatter.com/xpath-tester.html#before-output 和 http://xpather.com/),它们都返回 div 节点。 xpath 函数不能与 HTML Agility Pack 一起使用吗?我需要对 HTML Agility Pack 做一些不同的事情吗?
如果您使用
local-name()
函数,似乎可以工作。我认为这是 HtmlAgilityPack 中的一个错误。如果您查看 HtmlNodeNavigator.LocalName
here 的实现,它会说明 _attIndex
的设置并返回相应属性的名称。然而,here之后的
HtmlNodeNavigator.Name
的实现根本不考虑_attIndex
。因此,在您的情况下,即使 HtmlNodeNavigator
当前可能通过 _attIndex
指向属性本身,对 .Name
属性的调用也会错误地返回 div
而不是 onclick
。