如何在C#中计算HTML文件中表格的行数

3
当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,对吗?在调试期间将鼠标悬停在“tables”和“rows”集合上,检查其中的内容。 - Robert Harvey
3个回答

1
你可以将每个<table><tr>推入堆栈,当遇到</table>时-弹出,直到从堆栈中弹出表格。

有更具体的细节会很有帮助。你所说的“stack”是什么意思?你是指一种数据结构,他们会实例化并解析HTML,还是其他什么东西?看起来他们还没有使用这种方法。另外,请在DOM元素周围使用<>,这样它们更容易阅读,并在它们(以及您使用的任何其他代码片段)周围使用代码格式。谢谢! - bcr

1
我建议您尝试使用csQuery nuget包。它旨在消除执行类似操作的大部分麻烦。您可以使用css选择器查询语法,这是大多数Web开发人员都非常熟悉的。在这种情况下,您可能只需要使用body > table:nth-of-type(2) > tr,它将返回所有tr的数组,然后只需计算它们的数量或检查结果数组的长度即可。或者,从您提供的示例中,body > table ~ table > tr也可以起作用,br + table > tr也可以。

0

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

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++;
}

消息框会弹出2次:

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

编辑(回答问题):

1)我从int i = 1开始计数。 var i = 1是同样的事情,它只是自动用int替换var

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++;
}

消息框将弹出2次:

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

我需要一些帮助。i下面有一个波浪线,并显示错误“当前上下文中不存在名称'i'”。 - user1944272
问题1:我不得不初始化变量“i”,因为它下面有一个波浪线。我是这样做的:var i = 0;。我应该以不同的方式处理吗? 问题2:我也有两条消息返回,都说:“表#0的父项有3行。”你的代码如何给出“#3”和“#4”? 问题3:为什么你的代码对于两个答案都给出“3行”?这是错误的。第一张表只有2行。帮我让它返回正确的答案。 - user1944272
我已编辑了我的代码并回答了你的问题,请看一下。 - a1204773
我现在理解了你的方法和回答。然而,我认为我真正需要的是直接查询表格自身的行数,而不是从子表格往回推导并询问其父表格的行数。我需要这样做是因为我不能总是确定表格会有一个子表格。是否有一种直接的方法从这个角度找到行数,而不会在存在嵌套表格时让代码混乱?你能帮我吗? - user1944272
我想从上面的示例文件中看到的结果是“表格#2有3行”。换句话说,我希望解决方案确定表格的行数,而忽略可能存在的子表格。 - user1944272

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接