Supprimer des attributs à l'aide de HtmlAgilityPack

html html-agility-pack html-parsing

Question

J'essaie de créer un extrait de code pour supprimer tous les attributs de style quelle que soit la balise, en utilisant HtmlAgilityPack .

Voici mon code:

var elements = htmlDoc.DocumentNode.SelectNodes("//*");

if (elements!=null)
{
    foreach (var element in elements)
    {
        element.Attributes.Remove("style");
    }
}

Cependant, je ne le fais pas coller? Si je regarde l'objet element immédiatement après Remove("style") . Je peux voir que l'attribut style a été supprimé , mais il apparaît toujours dans l'objet DocumentNode . : /

Je me sens un peu stupide, mais ça me semble? Quelqu'un a fait cela en utilisant HtmlAgilityPack? Merci!

Mettre à jour

J'ai changé mon code comme suit et cela fonctionne correctement:

public static void RemoveStyleAttributes(this HtmlDocument html)
{
   var elementsWithStyleAttribute = html.DocumentNode.SelectNodes("//@style");

   if (elementsWithStyleAttribute!=null)
   {
      foreach (var element in elementsWithStyleAttribute)
      {
         element.Attributes["style"].Remove();
      }
   }
}

Réponse acceptée

Votre extrait de code semble être correct - il supprime les attributs. Le problème est que DocumentNode .InnerHtml (je suppose que vous avez surveillé cette propriété) est une propriété complexe. Elle est peut-être mise à jour après des circonstances inconnues et vous ne devez pas utiliser cette propriété pour obtenir le document sous forme de chaîne. Au lieu de cela, la méthode HtmlDocument.Save :

string result = null;
using (StringWriter writer = new StringWriter())
{
    htmlDoc.Save(writer);
    result = writer.ToString();
}

La variable result contient maintenant la représentation sous forme de chaîne de votre document.

Une dernière chose: votre code peut être amélioré en modifiant votre expression en "//*[@style]" qui vous permet d'obtenir uniquement des éléments avec l'attribut style .


Réponse populaire

Voici une solution très simple

VB.net

element.Attributes.Remove(element.Attributes("style"))

c #

element.Attributes.Remove(element.Attributes["style"])


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