1

此代码对 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>

太感谢了!

4

0 回答 0