2015-04-01 53 views
0

我试图在HTML文档中找到以特定值开头的任何属性。我似乎有一个有效的XPath查询,但它在使用HTML Agility Pack时不会返回任何内容。如何使用HTML Agilty 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敏捷性包?

回答

1

使用HtmlAgilityPack(HAP)和XPath功能name(),我没有工作,但local-name()更换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")); 
+0

'name()'和'local-name()'之间的区别看起来很奇怪 - 如果一个属性不在名称空间中(就像上面的输入文档一样),两个函数都应该返回完全相同的值。如果情况并非如此,您应该考虑报告错误。 – 2015-04-01 13:55:16

+0

谢谢,我不知道'local-name()',但我同意Mathias,这似乎有点奇怪。 – rrrr 2015-04-02 08:52:13

+1

我在Html Agility Pack项目中提出了一个问题,如果发生任何问题,它会进行更新https://htmlagilitypack.codeplex.com/workitem/35920 – rrrr 2015-04-02 09:04:27

0

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

onclick="myFunction()" 

所以,是的,这是绝对有可能和XPath没有过错这里,问题就出在别处。也许你可以显示调用表达式的代码?你使用SelectSingleNode()

+0

作为Mathias说,你可能想,而不是Xpath的如VAR someValue中= documenturl.DocumentNode lookinto你的C#代码。的SelectNodes( “XPATH”)[0] .Attributes [ “点击”]值。 – Helmer 2015-04-01 11:53:54

+0

正在使用的方法是'SelectNodes()',使用'SelectSingleNode()'进行测试仍然没有结果。 – rrrr 2015-04-01 12:38:53

+0

@Helmer如问题所述,我希望在理想情况下使用单个XPath查询来完成此操作。我可以通过另一种方式实现结果,我只是不想。 – rrrr 2015-04-01 12:40:01

相关问题