我试图在HTML文档中找到以特定值开头的任何属性。我似乎有一个有效的XPath查询,但它在使用HTML Agility Pack时没有返回任何内容。
我知道我可能正在使用Linq,但我正在尝试重用现有功能并利用XPath查询。
示例HTML
<!DOCTYPE html>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>Loren ipsum</p>
<a href="http://www.myurl.com" onclick="myFunction()"></a>
</body>
</html>
XPath查询
//*/@*[starts-with(name(), 'on')]
使用HTML Agility Pack可以实现吗?
答案 0 :(得分:1)
使用HtmlAgilityPack(HAP)和XPath函数name()
对我来说不起作用,但用name()
替换local-name()
就可以了:
//*/@*[starts-with(local-name(), 'on')]
但是,SelectSingleNode()
和SelectNodes()
只能返回HtmlNode
(s)。当XPath表达式选择属性而不是节点时,将返回属性的所有者节点。所以最后你还需要通过除XPath之外的一些选项来获取属性,例如:
HtmlDocument doc;
......
var link = doc.DocumentNode
.SelectSingleNode("//*/@*[starts-with(local-name(), 'on')]");
var onclick = link.Attributes
.First(o => o.Name.StartsWith("on"));
答案 1 :(得分:0)
您的XPath表达式是正确的。将您显示的文档片段作为输入,结果为
onclick="myFunction()"
所以,是的,这肯定是可能的,XPath在这里没有错,问题出在其他地方。也许你可以展示调用表达式的代码?你使用SelectSingleNode()
吗?