Html Agility Pack - Supprimer les tags par ID ou classe

c# html-agility-pack

Question

Voici mon code HTML simplifié:

<html>
  <body>
    <div id="mainDiv">
       <div id="divToRemove"></div>
       <div id="divToKeep"></div>
       <div class="divToRemove"></div>
       <div class="divToRemove"></div>
    </div>
  </body>
</html>

Je veux supprimer les div avec l'ID ou la classe nommée "divToRemove" et ensuite je veux sélectionner uniquement le div appelé "mainDiv" (dans un HtmlNode).

Les résultats devraient être:

<html>
  <body>
    <div id="mainDiv">
       <div id="divToRemove"></div>
       <div id="divToKeep"></div>
       <div class="divToRemove"></div>
       <div class="divToRemove"></div>
    </div>
  </body>
</html>

Comment puis-je faire cela en utilisant HTML Agility Pack?

Merci!

Réponse acceptée

Le code suivant est une adaptation de cette page de forum Html Agility Pack afin de répondre à vos besoins. Essentiellement, nous allons attraper tous les divs, les parcourir en boucle et vérifier leur classe ou leur identifiant pour un match. Si c'est là retirez-le.

var divs = htmldoc.DocumentNode.SelectNodes("//div");
if (divs != null)
{
    foreach (var tag in divs)
    {
        if (tag.Attributes["class"] != null && string.Compare(tag.Attributes["class"].Value, "divToRemove", StringComparison.InvariantCultureIgnoreCase) == 0)
        {
            tag.Remove();
        } else if(tag.Attributes["id"] != null && string.Compare(tag.Attributes["id"].Value, "divToRemove", StringComparison.InvariantCultureIgnoreCase) == 0) {
            tag.Remove();
        }
    }
}

Vous pouvez également combiner ces déclarations if en une déclaration if large, mais j’ai pensé que cela se lisait mieux pour la réponse.

Enfin, sélectionnez le noeud que vous cherchiez ...

var divs = htmldoc.DocumentNode.SelectNodes("//div");
if (divs != null)
{
    foreach (var tag in divs)
    {
        if (tag.Attributes["class"] != null && string.Compare(tag.Attributes["class"].Value, "divToRemove", StringComparison.InvariantCultureIgnoreCase) == 0)
        {
            tag.Remove();
        } else if(tag.Attributes["id"] != null && string.Compare(tag.Attributes["id"].Value, "divToRemove", StringComparison.InvariantCultureIgnoreCase) == 0) {
            tag.Remove();
        }
    }
}

Réponse populaire

Personnellement, je préfère utiliser les méthodes Linq de HtmlAgilityPack. La sélection sera longue, mais relativement simple: il suffit de sélectionner les nœuds avec le bon id et / ou la bonne classe, puis d'appeler la méthode Remove() dessus.

foreach (var node in doc.DocumentNode.Descendants("div")
    .Where(n => n.Id.Equals("divToRemove", StringComparison.InvariantCultureIgnoreCase) 
        || n.GetAttributeValue("class", string.Empty).Equals("divToRemove", StringComparison.InvariantCultureIgnoreCase)))
    node.Remove();
HtmlNode mainNode = doc.DocumentNode.Descendants("div").Where(n => n.Id.Equals("mainDiv", StringComparison.InvariantCultureIgnoreCase).First();



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