2014-09-23 47 views
0

我在C#中使用这个命令:HtmlAgilityPack中的可变标签?

foreach (HtmlNode node in 
    htmlDoc.DocumentNode.SelectNodes("//tr[@class='discussion r1']")) 

的问题是,我需要一个包含所有rX节点:

discussion r0 
discussion r1 
discussion r2 

我如何可以选择所有rX节点? 如何在一个foreach中只选择r0r1

回答

0

HtmlNode.SelectNodes()仅支持没有正则表达式匹配功能的XPath 1.0。使用简单的XPath starts-with()或功能应该做的伎俩:

//using starts-with() 
htmlDoc.DocumentNode 
     .SelectNodes("//tr[starts-with(@class,'discussion r')]") 
//or using contains() 
htmlDoc.DocumentNode 
     .SelectNodes("//tr[contains(@class,'discussion r')]") 
+0

非常感谢你,这个工程 2 Precisation: - 是否有一些性能的。 “开始 - 与”和“包含”之间的区别? - 如何只选择r1和r2节点而不是r3? – hellomoto 2014-09-24 01:51:46

+0

1.我认为这两个函数之间没有明显的性能差异。 XPath'或'运算符,但是如果您想要匹配r1到r11等范围,但不是r12或更高,我建议使用HAP的LINQ API而不是使用XPath。 – har07 2014-09-24 02:13:11

0

您可以尝试使用正则表达式(使用matches功能)来配合rX

  • //tr[matches(@class,'discussion r.')]如果只有一个r
  • //tr[matches(@class,'discussion r.+')]后字符时,至少有一个
  • //tr[matches(@class,'discussion r\d+')]如果需要后面跟一个数字
+0

我想你的3个解决方案,但没有工作:( – hellomoto 2014-09-23 19:34:10