2016-09-24 230 views
0

我有一个HTML文档,我得到基于类的元素。一旦我有他们,我经历的每个元素,并得到进一步的元素:Foreach没有遍历元素

var doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml(content); 

var rows = doc.DocumentNode.SelectNodes("//tr[contains(@class, 'row')]"); 
foreach (var row in rows) 
{ 
    var name = row.SelectSingleNode("//span[contains(@class, 'name')]").InnerText, 
    var surname = row.SelectSingleNode("//span[contains(@class, 'surname')]").InnerText, 

    customers.Add(new Customer(name, surname)); 
}; 

然而,上述通过迭代行,但始终检索第一行的文本。

XPath是否错误?

回答

1

这是XPath中的FAQ。只要您的XPath以/开头,它就会忽略上下文元素(在这种情况下,由row变量引用的元素)。它会从根文档节点开始搜索匹配元素,而不管上下文如何。这就是为什么你的SelectSingleNode()总是返回相同的元素,这是整个文档中第一个匹配的元素。

你只需要预先设置一个点(.),使其相对于当前上下文元素:

foreach (var row in rows) 
{ 
    var name = row.SelectSingleNode(".//span[contains(@class, 'name')]").InnerText, 
    var surname = row.SelectSingleNode(".//span[contains(@class, 'surname')]").InnerText, 

    customers.Add(new Customer(name, surname)); 
} 
0

如何使用LINQ?

var customers = rows.Select(row => new Customer(Name = row.SelectSingleNode("//span[contains(@class, 'name')]").InnerText, Surname = row.SelectSingleNode("//span[contains(@class, 'surname')]").InnerText)).ToList();