Come contare le righe in una tabella in un file html C #

c# html-agility-pack html-parsing linq

Domanda

Quando c'è una tabella composta all'interno di un file html, come si può contare le righe della tabella genitore.

Cosa intendo con un tavolo composto; una tabella in cui altre tabelle sono contenute in alcune delle sue celle.

Ecco il mio tentativo di codifica. Nota Ricevo un valore errato:

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

Si prega di indicare quale spazio dei nomi è utilizzato nella risposta.

Ecco un file di esempio rappresentativo:

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

Grazie.

Risposta accettata

Se ho capito bene, questo è quello che vuoi.

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

Il MessageBox comparirà 2 volte:

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

MODIFICA (DOMANDE RISPOSTA):

1) Ho iniziato il counter da int i = 1 . La var i = 1 sarà la stessa cosa, sostituirà automaticamente var con int .

2) Ho modificato il codice ora avrai lo stesso risultato con me

3) Ho iniziato a contare da 1 in modo da avere la tabella n. 1, la tabella n. 2, la tabella n. 3 e la tabella n. I tuoi ultimi 2 tavoli (tabella 3 e 4) sono sotto-tabelle della tabella 2, la tabella 2 ha 3 righe. Il mio codice sopra stampa solo le tabelle che sono sotto-tabelle di alcune tabelle. Puoi mostrarmi quello che vuoi come risposta?

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

Il MessageBox comparirà 2 volte:

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

Risposta popolare

Ti consiglierei di provare il pacchetto csQuery nuget. È progettato per eliminare la maggior parte dei mal di testa dal fare cose esattamente simili. È possibile utilizzare la sintassi delle query del selettore css, a cui la maggior parte degli sviluppatori di siti Web hanno una certa familiarità. In questo caso, è probabile che tu riesca a farcela con body > table:nth-of-type(2) > tr e restituirà un array di tutti i tr, quindi contarli, o controllare la lunghezza dell'array risultante. In alternativa, body > table ~ table > tr funzionerebbe ugualmente dall'esempio che hai dato come br + table > tr



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché