Wie man Zeilen in einer Tabelle in einer HTML-Datei zählt C #

c# html-agility-pack html-parsing linq

Frage

Wenn es eine zusammengesetzte Tabelle in einer HTML-Datei gibt, wie kann man die Zeilen der Elterntabelle zählen.

Was ich mit einem zusammengesetzten Tisch meine; eine Tabelle, in der andere Tabellen in einigen ihrer Zellen enthalten sind.

Hier ist mein Versuch, zu kodieren. Hinweis Ich erhalte falsche Werte:

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

Bitte geben Sie an, welcher Namensraum in Ihrer Antwort verwendet wird.

Hier ist eine repräsentative Beispieldatei:

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

Vielen Dank.

Akzeptierte Antwort

Wenn ich das richtig verstanden habe, ist das was du willst.

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

Die MessageBox erscheint 2 mal:

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

BEARBEITEN (ANTWORT FRAGEN):

1) Ich habe Zähler von int i = 1 gestartet. Das var i = 1 wird das gleiche sein, es ersetzt var einfach durch int .

2) Ich habe Code bearbeitet, jetzt wirst du dasselbe Ergebnis mit mir haben

3) Ich habe angefangen von 1 zu zählen, also hast du Tisch # 1, Tisch # 2, Tisch # 3 und Tisch # 4. Ihre 2 letzten Tabellen (Tabelle 3 und 4) sind Untertabellen der Tabelle 2, Tabelle 2 haben 3 Zeilen. Mein obiger Code druckt nur Tabellen, die Untertabellen einer Tabelle sind. Kannst du mir zeigen, was du als Antwort willst?

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

Die MessageBox erscheint 2 mal:

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

Beliebte Antwort

Ich würde empfehlen, dass Sie das csQuery nugget-Paket ausprobieren. Es wurde entwickelt, um die meisten Kopfschmerzen aus genau diesen Dingen zu nehmen. Sie können die CSS-Selektor-Abfragesyntax verwenden, mit der die meisten Web-Devs vertraut sind. In diesem Fall könnten Sie wahrscheinlich mit body > table:nth-of-type(2) > tr auskommen und ein Array aller trs zurückgeben, dann einfach zählen oder die Länge des resultierenden Arrays überprüfen. Alternativ würde body > table ~ table > tr auch von dem Beispiel, das Sie angegeben haben, genauso funktionieren wie br + table > tr



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum