HtmlAgilityPack: récupère tous les éléments par classe

.net asp.net c# html-agility-pack regex

Question

J'ai un code HTML et j'ai besoin d'obtenir des nœuds par classe. Donc je ne peux pas le faire parce que

  1. Je ne connais pas le chemin XML
  2. Articles nécessaires sans identifiant, seulement classe
  3. HtmlAgilityPack ne permet pas d'obtenir tous les éléments (comme le permet XDocument ), mais doc.Elements() ne fonctionne que si j'ai un identifiant, mais ce n'est pas le cas. Donc, je ne SelectNodes pas non plus le chemin XML, donc je ne peux pas utiliser la méthode SelectNodes
  4. Je ne peux pas utiliser les expressions rationnelles

mon code était

public static class HapHelper
{
    private static HtmlNode GetByAttribute(this IEnumerable<HtmlNode> htmlNodes, string attribute, string value)
    {
        return htmlNodes.First(d => d.HasAttribute(attribute) && d.Attributes[attribute].ToString() == value);
    }

    public static HtmlNode GetElemenyByAttribute(this HtmlNode parentNode, string attribute, string value)
    {
        return GetByAttribute(parentNode.Descendants(), attribute, value);
    }

    public static bool HasAttribute(this HtmlNode d, string attribute)
    {
        return d.Attributes.Contains(attribute);
    }

    public static HtmlNode GetElementByClass(this HtmlNode parentNode, string value)
    {
        return parentNode.GetElemenyByAttribute("class", value);
    }
}

mais cela ne fonctionne pas, car Descendants() ne renvoie que les nœuds les plus proches.

Que puis-je faire?

Réponse acceptée

Apprenez XPath! :-) C'est très simple et vous servira bien. Dans ce cas, ce que vous voulez c'est:

SelectNodes("//*[@class='" + classValue + "']") ?? Enumerable.Empty<HtmlNode>();



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