如何使用HTML Agility Pack查找以特定值开头的属性?

时间:2015-04-01 10:15:31

标签: html xpath html-agility-pack

我试图在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可以实现吗?

2 个答案:

答案 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()吗?