2010-07-10 212 views
4

我想在每行使用HTMLAgilityPack获取一些特定的单元格。获取每个HTML表格行的第一个和第二个单元格

foreach (HtmlNode row in ContentNode.SelectNodes("descendant::tr")) 
{ 
    //Do something to first cell 
    //Do something to second cell 
} 

有更多的细胞,每个细胞需要一些专门的治疗。我想有一种方法可以使用XPath来做到这一点,但我相当无用。有没有可能像

var cell1 = row.SelectSingleNode("descendant::td:first"); 
+0

问得好(+1)。查看我的答案,了解一个完全选择所需节点的单行XPath表达式。 – 2010-07-12 13:10:05

回答

2

要获得是一排的孩子每个第一个单元格,你可以做到以下几点:

// from row 
var firstCell = row.SelectSingleNode("td[1]"); 

// each first cell in a table (note: tbody is not always there) 
var allFirstCells = table.SelectNodes("tbody/tr/td[1]"); 

换句话说,使用方括号和细胞数你想选择。一个例外是最后一个单元格,你可以开始使用last()如下:

// from row 
var lastCell = row.SelectSingleNode("td[last()]"); 

// each last cell in a table 
var allLastCells = table.SelectNodes("tbody/tr/td[last()]"); 

如果你想获得下一到当前单元格的单元格,可以做这样的事情:

// from row 
var firstCell = row.SelectSingleNode("td[1]"); 
var siblingCell = firstCell.SelectSingleNode("./following-sibling::td"); 

您可能希望检查null的返回值,这意味着您要么有拼写错误,要么加载的DOM树不包含您要求的单元格。

+0

甜!这只是“常规”XPath,还是来自htmlagilitypack-dudes的特殊调制? – peirix 2010-07-13 07:46:33

+0

@peirix:完全正常的XPath。 HtmlAgility不添加任何特殊的东西。他们创建一个.NET DOM,而SelectNodes使用Microsoft的.NET XPath 1.0实现。 – Abel 2010-07-13 16:11:32

2

而不是

descendant::tr 

使用

descendant::tr/td[not(position() >2)] 
+1

+1,很好和快速的解决方案。但对于*“每个单元格需要特殊处理”*(OQ),业务逻辑将需要一个“mod 2”或类似的代码,并且在每行不包含> 1个单元格的情况下会出现问题。 – Abel 2010-07-13 16:19:26

相关问题