此代码对 html 文档中包含的第一个表中的最后一列求和。(它忽略了第一行。)
1.) 我如何对指定的列进行求和,而不仅仅是最后一列?
var sum = doc.DocumentNode.SelectSingleNode("//table")
.Elements("tr")
.Skip(1)
.Sum(tr => int.Parse(tr.Elements("td").Last().InnerText));
这段代码来自哪里......我收到了这段代码作为回复:(使用 C# 和 html-agility-pack 在 html 表中求和列)但我无法得到任何关于它如何工作的解释。
我为回答我的问题所做的工作......我已经工作了好几个小时试图理解语法。我的努力包括:VS 对象浏览器、Html-Agility-Pack CHM 文档、关于 XPath 的 W3Schools 教程和代码实验。我还是有点失落。我想更好地理解语法,以便我可以在一定程度上独立地继续我的项目。
2.)以下是我对语法的最佳解释。我哪里错了?我在哪里错过了什么?
var sum = doc.DocumentNode.SelectSingleNode("//table")
上面得到了第一个表。如果是的话,//table[2]
它会得到第二张桌子
.Elements("tr")
以上是否指定总和将超过行集?
.Skip(1)
第一行被排除在要求和的行集(列)之外。
.Sum(tr => int.Parse(tr.Elements("td").Last().InnerText));
上面的有点令人费解,但我会尝试......
.Sum(
Sum 语句开始
tr =>
什么是“tr”?它不在引号中,因为它与父母一起出现。这不是一个关键词是吗?解释。上面的片段开始了将被求和的行(列)的范围。
int.Parse(
将文本转换为整数
tr.Elements("td").Last().InnerText));
混乱???
tr
她又是那个“tr”
tr.Element(
从 VS 对象浏览器.Elements()
“获取集合中的所有第一代元素”。这意味着什么?
tr.Elements("td")
“td”指定它是被求和的数据元素
tr.Elements("td").Last()
.Last()
指定“td”求和的范围将出现在最后一列。有其他方法来写这个我是对的吗?除了“最后一个”列之外,如何指定任何内容?如何指定第三列?
.InnerText
为什么是.InnerText
必要的?不int.Parse()
将其内容作为字符串并将其转换为 int?我错过了什么?
3.)你能推荐任何关于 html-agility-pack 的学习资源吗?我刚刚学习了 W3Schools 的 XPath 教程。我看到远程语法相似性,但似乎对处理表没有什么帮助。
上面的代码可以运行的示例 html:
<html>
<body>
<table border="1">
<tr>
<th>Product Group A</th>
<th>Mat'l</th>
<th>Weight</th>
<th>Size</th>
</tr>
<tr>
<td>ELL</td>
<td>Plastic1</td>
<td>5</td>
<td>11</td>
</tr>
<tr>
<td>TEE</td>
<td>Plastic2</td>
<td>8</td>
<td>23</td>
</tr>
<tr>
<td>Straight</td>
<td>Plastic3</td>
<td>21</td>
<td>71</td>
</tr>
</table>
<p></p>
<table border="1">
<tr>
<th>Product Group B</th>
<th>Mat'l</th>
<th>Weight</th>
<th>Size</th>
</tr>
<tr>
<td>Plumb Bob</td>
<td>Bronze1</td>
<td>8</td>
<td>3</td>
</tr>
<tr>
<td>Hammer</td>
<td>Bronze2</td>
<td>12</td>
<td>8</td>
</tr>
<tr>
<td>Sleeve Bearing</td>
<td>Bronze3</td>
<td>18</td>
<td>7</td>
</tr>
</table>
</body>
太感谢了!