2016-09-24 231 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();