Cómo contar filas en una tabla en un archivo html C #

c# html-agility-pack html-parsing linq

Pregunta

Cuando hay una tabla compuesta dentro de un archivo html, ¿cómo se pueden contar las filas de la tabla principal?

Lo que quiero decir con una tabla compuesta; una tabla en la que otras tablas están contenidas dentro de algunas de sus celdas.

Aquí está mi intento de codificación. Nota recibo unos valores incorrectos:

        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());

Por favor indique qué espacio de nombres se usa en su respuesta.

Aquí hay un archivo de ejemplo representativo:

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

Gracias.

Respuesta aceptada

Si entendí correctamente esto es lo que quieres.

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

El MessageBox aparecerá 2 veces:

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

EDITAR (RESPONDIENDO PREGUNTAS):

1) Comencé el contador desde int i = 1 . La var i = 1 será la misma cosa, simplemente reemplaza automáticamente var con int .

2) Edité el código ahora tendrás el mismo resultado conmigo

3) Comencé a contar desde 1, así que tienes la tabla # 1, la tabla # 2, la tabla # 3 y la tabla # 4. Sus 2 últimas tablas (tabla # 3 y # 4) son sub-tablas de la tabla # 2, la tabla # 2 tiene 3 filas. Mi código anterior imprime solo tablas que son sub-tablas de alguna tabla. ¿Me puedes mostrar lo que quieres como respuesta?

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

El MessageBox aparecerá 2 veces:

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

Respuesta popular

Le recomendaría que pruebe el paquete nuget csQuery. Está diseñado para eliminar la mayoría de los dolores de cabeza de hacer las cosas exactamente así. Puede usar la sintaxis de consulta del selector css, con la que la mayoría de los desarrolladores web están bastante familiarizados. En este caso, probablemente podría salirse con body > table:nth-of-type(2) > tr y devolverá una matriz de todos los tr, luego solo cuéntelos o verifique la longitud de la matriz resultante. Alternativamente, body > table ~ table > tr funcionaría igual de bien que la muestra que dio, como lo haría br + table > tr



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow