Как подсчитать строки в таблице в файле 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 будет одним и тем же, он просто автоматически заменит var на int .

2) Я отредактировал код, теперь у меня будет тот же результат

3) Я начал отсчет с 1, так что у вас есть таблица №1, таблица №2, таблица №3 и таблица №4. Ваши 2 последних таблицы (таблица № 3 и № 4) являются подтаблицами таблицы №2, таблица №2 имеет 3 строки. Мой выше код печатает только таблицы, которые являются подтаблицами некоторой таблицы. Можете ли вы показать мне, что вы хотите в качестве ответа?

EDIT 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, который большинство веб-разработчиков хорошо знакомы. В этом случае вам, вероятно, удастся с 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
Является ли этот КБ законным? Да, узнайте, почему