使用HtmlAgilityPack删除属性

时间:2011-05-01 19:19:54

标签: html html-parsing html-agility-pack

我正在尝试创建一个代码段来删除所有style属性,而不管使用HtmlAgilityPack的标记。

这是我的代码:

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

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

然而,我不是要坚持下去?如果我在element之后立即查看Remove("style")对象。我可以看到样式属性已被删除,但它仍然出现在DocumentNode对象中。 :/

我感觉有点愚蠢,但似乎对我不利?有人用HtmlAgilityPack做过这个吗?谢谢!

更新

我将代码更改为以下内容,并且正常运行:

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

2 个答案:

答案 0 :(得分:7)

您的代码段似乎是正确的 - 它会删除属性。问题是,DocumentNode .InnerHtml(我假设你监视了这个属性)是一个复杂的属性,也许它在一些未知的情况下得到更新,你实际上不应该使用这个属性将文档作为字符串。而不是HtmlDocument.Save方法:

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

现在result变量保存文档的字符串表示形式。

还有一件事:您可以通过将表达式更改为"//*[@style]"来改进代码,这样只会使您获得style属性的元素。

答案 1 :(得分:2)

这是一个非常简单的解决方案

VB.net

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

C#

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