Comment compter les lignes d'une table dans un fichier html C #

c# html-agility-pack html-parsing linq

Question

Quand il y a une table composée dans un fichier html, comment peut-on compter les lignes de la table parent?

Ce que je veux dire par une table composée; une table dans laquelle d'autres tables sont contenues dans certaines de ses cellules.

Voici ma tentative de codage. Notez que je reçois une valeur incorrecte:

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

Veuillez indiquer quel espace de noms est utilisé dans votre réponse.

Voici un exemple de fichier représentatif:

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

Je vous remercie.

Réponse acceptée

Si j'ai bien compris c'est ce que vous voulez.

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

Le MessageBox apparaîtra 2 fois:

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

ÉDITER (QUESTIONS À RÉPONDRE):

1) J'ai commencé le compteur d' int i = 1 . Le var i = 1 sera la même chose, il vient juste de remplacer automatiquement var avec int .

2) J'ai édité le code maintenant vous aurez le même résultat avec moi

3) J'ai commencé à compter à partir de 1 et vous avez donc les tables n ° 1, n ° 2, n ° 3 et n ° 4. Vos 2 dernières tables (tables n ° 3 et n ° 4) sont des sous-tables de la table n ° 2, la table n ° 2 ayant 3 lignes. Mon code ci-dessus imprime uniquement les tables qui sont des sous-tables de certaines tables. Pouvez-vous me montrer ce que vous voulez comme réponse?

EDIT 2:

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

Le MessageBox apparaîtra 2 fois:

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

Réponse populaire

Je vous recommande d'essayer le paquet nuget csQuery. Il est conçu pour éliminer la plupart des maux de tête de ce genre de choses. Vous pouvez utiliser la syntaxe de requête css selector, que la plupart des développeurs web connaissent bien. Dans ce cas, vous pourriez probablement vous en sortir avec body > table:nth-of-type(2) > tr et elle retournera un tableau de tous les tr, puis les comptera ou vérifiera la longueur du tableau résultant. Alternativement, body > table ~ table > tr fonctionnerait aussi bien à partir de l’échantillon que vous avez donné que br + table > tr




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi