我正在尝试创建一个代码段来删除所有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();
}
}
}
答案 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"])