Удалить атрибуты с помощью HtmlAgilityPack

Я пытаюсь создать фрагмент кода, чтобы удалить все атрибуты 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();
      }
   }
}

Ответы

Ответ 1

Ваш фрагмент кода кажется правильным - он удаляет атрибуты. Дело в том, что DocumentNode .InnerHtml (я предполагаю, что вы контролировали это свойство) является сложным свойством, возможно, он обновляется после некоторых неизвестных обстоятельств, и вы фактически не должны использовать это свойство, чтобы получить документ в виде строки. Вместо этого метод HtmlDocument.Save для этого:

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

теперь переменная result содержит строковое представление вашего документа.

Еще одна вещь: ваш код можно улучшить, изменив выражение на "//*[@style]", которое получает только элементы с атрибутом style.

Ответ 2

Вот очень простое решение

VB.net

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

С#

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