Foreach不迭代元素

时间:2016-09-24 10:19:20

标签: c# xpath html-agility-pack

我有一个HTML文档,我正在根据类获取元素。一旦我拥有它们,我就会浏览每个元素并获得更多元素:

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是错误的吗?

2 个答案:

答案 0 :(得分:1)

这是XPath中的常见问题解答。每当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));
}

答案 1 :(得分: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();