Удалить атрибуты с помощью 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();
      }
   }
}

person Ted Nyberg    schedule 01.05.2011    source источник
comment
Можете ли вы добавить код воспроизведения? потому что я протестировал этот HTML <html style='style1'><body style='style2'></body></html> и он работает   -  person Simon Mourier    schedule 02.05.2011
comment
Используете ли вы свойство InnerHtml? На момент написания этого у него была ошибка, вместо этого используйте метод WriteContentTo.   -  person greenoldman    schedule 16.07.2011


Ответы (2)


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

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

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

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

person Alex    schedule 06.05.2011
comment
Спасибо за ответ! Да, я изменил свой код на следующий, чтобы он закрепился: if (elementsWithStyleAttribute!=null) { foreach (элемент var в elementsWithStyleAttribute) { element.Attributes[style].Remove(); } } }' Не знаю, почему мой исходный код не работал, но думаю, вы правы в своем предположении. Спасибо! - person Ted Nyberg; 08.05.2011
comment
Ничего себе, форматирование кода в комментариях не очень хорошо. :) Обновил мой вопрос с измененным фрагментом кода. Еще раз спасибо! - person Ted Nyberg; 08.05.2011

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

ВБ.нет

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

c#

element.Attributes.Remove(element.Attributes["style"])
person Otto Kanellis    schedule 05.08.2014
comment
Спасибо, одно исправление: element.Attributes(style) должен быть element.Attributes[style] - person Patrick Koorevaar; 03.11.2014
comment
Вы правы, потому что я не понимаю: мой код для vb.net - person Otto Kanellis; 05.11.2014