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>

谢谢你。

4

3 回答 3

1

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

于 2013-06-04T03:41:06.610 回答
1

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

于 2013-06-04T02:55:40.877 回答
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++;
}

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是相同的东西,它只是自动替换varint.

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."
于 2013-06-06T13:59:20.807 回答