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