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

How do I find attributes starting with a specific value using HTML Agility Pack?

我试图在 HTML 文档中查找以特定值开头的任何属性。我似乎对此有一个有效的 XPath 查询,但是在使用 HTML Agility Pack 时 returns 什么都没有。

我知道我可以使用 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 吗?

您的 XPath 表达式是正确的。将您显示的文档片段作为输入,结果为

onclick="myFunction()"

所以,是的,这绝对是可能的,这里的 XPath 没有问题,问题出在其他地方。也许你可以展示调用表达式的代码?你用SelectSingleNode()吗?

使用 HtmlAgilityPack (HAP) 和 XPath 函数 name() 对我不起作用,但是用 local-name() 替换 name() 就可以了:

//*/@*[starts-with(local-name(), 'on')]

然而,SelectSingleNode()SelectNodes()都只能returnHtmlNode(s)。当 XPath 表达式选择属性而不是节点时,属性的所有者节点将被 returned。所以最后还是需要通过XPath之外的一些选项来获取属性,例如:

HtmlDocument doc;
......
var link = doc.DocumentNode
              .SelectSingleNode("//*/@*[starts-with(local-name(), 'on')]");
var onclick = link.Attributes
                  .First(o => o.Name.StartsWith("on"));