HtmlAgilityPackを使用して属性を削除する

html html-agility-pack html-parsing

質問

私はHtmlAgilityPackを使用してタグに関係なくすべてのstyle属性を削除するためのコードスニペットを作成しようとしています。

ここに私のコードです:

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

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

しかし、私はそれに固執するつもりはない? Remove("style")直後にelementオブジェクトを見た場合。 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();
      }
   }
}

受け入れられた回答

あなたのコードスニペットは正しいと思われます - 属性を削除します。問題は、 DocumentNode .InnerHtml (私はあなたがこのプロパティを監視していると仮定します)は複雑なプロパティです。不明な状況の後に更新され、実際にはこのプロパティを使用してドキュメントを文字列として取得しないでください。代わりに、これのHtmlDocument.Saveメソッド:

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

result変数は、ドキュメントの文字列表現を保持します。

もう一つは、式を"//*[@style]"変更することでコードを改善し、 style属性を持つ要素だけを得ることができます。


人気のある回答

ここには非常に簡単な解決策があります

VB.net

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

C#

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



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ