如何计算html文件中表中的行C#

c# html-agility-pack html-parsing linq

当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>

谢谢。

一般承认的答案

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

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将是相同的,它只是自动用int替换var

2)我编辑了代码,现在你和我有相同的结果

3)我从1开始计数,所以你有表#1,表#2,表#3和表#4。最后2个表(表#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."

热门答案

我建议你试试csQuery nuget包。它的设计目的是让大部分的麻烦完全不像那样做。您可以使用css选择器查​​询语法,大多数Web开发人员都非常熟悉它。在这种情况下,您可能可以使用body > table:nth-of-type(2) > tr ,它将返回所有tr的数组,然后只计算它们,或检查结果数组的长度。或者, body > table ~ table > tr也可以从你给出的样本中获得, br + table > tr



Related

许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow