我正在尝试使用以下代码解析HTML表的内容。当我尝试更新rowVals集合中的元素时,会出现我的问题:它告诉我该值是只读的。
有些行跨越多列,因此我想确保在解析表时将单元格值映射到相应的列。
我知道当集合被迭代时,它会在你尝试更新该集合时窒息。由于我不是通过rowVals集合进行迭代,而是通过另一个集合进行迭代,因此当我尝试在rowVals中设置特定KVP元素的值时,我不明白为什么我的代码会窒息。任何人都可以建议一种方法来完成设置适当的值而无需添加/删除现有的KVP吗?
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.Load(filePath);
var root = doc.DocumentNode.Descendants().First(t => t.Name == "body");
var tables = root.Descendants().Where(t => t.Name == "table");
var trs = tables.First().Elements("tr");
//parse the headers
var headers = trs.First().Elements("th").Select(t => t.InnerText);
//parse the column values
var cells = trs.Skip(1).Select(tr => tr.Elements("td"));
//update the column values for each row
foreach (var item in cells)
{
int x = 0;
var rowVals = headers.ToDictionary(t => t, t=>"");
foreach (var item2 in item)
{
rowVals.ElementAt(x).Value = item2.InnerText;
if (item2.Attributes.Any(t => t.Name == "colspan"))
{
x = x + int.Parse(item2.Attributes.First(t => t.Name == "colspan").Value) - 1;
}
else
{
x++;
}
}
}
答案 0 :(得分:3)
您永远不能设置KeyValuePair
的值,因为the property is read only开头。这个问题与集合迭代无关。
其次,词典不保证项目的顺序,所以使用.ElementAt()
无论如何都没有意义。