【问题标题】:How to count rows in a table in an html file C#如何计算html文件C#中表中的行数
【发布时间】:2013-05-30 07:51:58
【问题描述】:

当html文件中有复合表时,如何计算父表的行数。

我所说的复合表是什么意思;一个表格,其中其他表格包含在其某些单元格中。

这是我的编码尝试。注意我收到的值不正确:

        String htmlFile = "C:/Temp/Test_13.html";
        HtmlDocument doc = new HtmlDocument();
        doc.Load(htmlFile);

        HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table");
        HtmlNodeCollection rows = tables[1].SelectNodes(".//tr");
        Console.WriteLine(" Rows in second (Parent) table: " + rows.Count());

请说明您的答案中使用了哪个命名空间。

这是一个有代表性的示例文件:

<html>
<body>
<table border="1">
<tr>
<td>Apps</td>
</tr>
<tr>
<td>Offcie Web Apps</td>
</tr>
</table>
<br/>
<table border="1">
<tr>
<td>Application</td>
<td>Status</td>
<td>Instances</td>
</tr>
<tr>
<td>PowerPoint</td>
<td>Online</td>
<td>
    <table border="1">
    <tr>
        <td>Server1</td>
        <td>Online</td>
    </tr>
    <tr>
        <td>Server2</td>
        <td>Disabled</td>
    </tr>
    </table>
</td>
</tr>
<tr>
<td>Word</td>
<td>Online</td>
<td>
    <table border="1">
    <tr>
        <td>Server1</td>
        <td>Online</td>
    </tr>
    <tr>
        <td>Server2</td>
        <td>Disabled</td>
    </tr>
    </table>
</td>
</tr>
</table>
</body>
</html>

谢谢。

【问题讨论】:

  • 您使用的是 Visual Studio,对吗?通过在调试期间将鼠标悬停在它们上来检查您的 tablesrows 集合;看看里面有什么。

标签: c# linq html-parsing html-agility-pack


【解决方案1】:

如果我理解正确,这就是你想要的。

int i = 1;
HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table");
foreach (HtmlNode table in tables)
{
    var tmp = table.ParentNode;
    if (tmp.OriginalName.Contains("td"))
        MessageBox.Show("The parent of table #" + i + " has" + tmp.ParentNode.ParentNode.Elements("tr").Count().ToString() + " rows.");
    i++;
}

MessageBox 会弹出 2 次:

"The parent of table #3 has 3 rows."
"The parent of table #4 has 3 rows."

编辑(回答问题):

1) 我从int i = 1 开始计数器。 var i = 1 是一样的,它只是自动将var 替换为int

2) 我现在编辑了代码,你会得到和我一样的结果

3) 我从 1 开始数,所以你有表 #1、表 #2、表 #3 和表 #4。您的最后两张表(表 #3 和 #4)是表 #2 的子表,表 #2 有 3 行。我上面的代码只打印作为某个表的子表的表。你能告诉我你想要什么作为答案吗?

编辑 2:

int i = 1;
HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table");
foreach (HtmlNode table in tables)
{
    if (!table.ParentNode.OriginalName.Contains("td")) // If table is not sub-table
        MessageBox.Show("Table #" + i + " have " + table.Elements("tr").Count().ToString() + " rows.");
    i++;
}

MessageBox 会弹出 2 次:

"The parent of table #1 has 2 rows."
"The parent of table #2 has 3 rows."

【讨论】:

  • 我需要一些帮助。 i 下方有一条波浪线,并显示错误“当前上下文中不存在名称 'i'
  • 问题 1:我必须初始化变量“i”,因为它下面有一条波浪线。我是这样做的:var i = 0;。我应该以不同的方式处理吗?问题 2:我还返回了两条消息:The parent of table #0 has3 rows. 您的代码如何给出“#3”和“#4”?问题 3:为什么您的代码对两个答案都给出“3 行”?这是错误的。第一个表有 2 行,而不是 3 行。帮助我得到这个以返回正确的答案。
  • 我编辑了我的代码并回答了你的问题,请看一下
  • 我现在看到了您的方法并理解了您的回复。但是,我认为我真正需要的是一种解决方案,可以直接查询表以获取其自身的行数,而不是从子表返回并询问其父表的行数。我需要这样做,因为我不能总是确定该表会有一个子表。是否有一种直接的方法可以从这个角度查找行数,而不会在存在嵌入表时混淆代码?你能帮我解决这个问题吗?
  • 我希望从上面的示例文件中看到的结果是“表#2 有 3 行”。换句话说,我希望解决方案确定表的行数,而忽略可能的子表的存在。
【解决方案2】:

我建议您尝试使用 csQuery nuget 包。它旨在消除做类似事情的大部分麻烦。您可以使用大多数 Web 开发人员都非常熟悉的 css 选择器查询语法。在这种情况下,您可能会逃脱 body &gt; table:nth-of-type(2) &gt; tr 并且它将返回所有 tr 的数组,然后只计算它们,或检查结果数组的长度。或者,body &gt; table ~ table &gt; tr 与您提供的示例一样有效,br + table &gt; tr

【讨论】:

    【解决方案3】:

    您可以将每个&lt;table&gt;&lt;tr&gt; 推入堆栈,当遇到&lt;/table&gt; - 弹出直到表格从堆栈中弹出。

    【讨论】:

    • 了解更多具体细节会很有帮助。 “堆栈”是什么意思?您是指他们将实例化和解析 HTML 的数据结构,还是其他?看起来他们已经在使用这种方法了。此外,请在 DOM 元素周围使用&lt;&gt;,这使它们更易于阅读,并在它们周围使用代码格式(以及您使用的任何其他代码 sn-ps)。谢谢!
    猜你喜欢
    • 2011-03-05
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多