どのように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は同じものですが、 varint自動的に置き換えます。

2)私はコードを編集しました。あなたは私と同じ結果を持っています。

3)テーブル1、テーブル2、テーブル3、テーブル4のように1から数え始めました。あなたの最後の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ナゲットパッケージを試してみることをお勧めします。それは、まさにそのようなことから頭痛の大部分を取り除くように設計されています。ほとんどのWeb開発者がよく知っているcssセレクター照会構文を使用することができます。この場合、おそらく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