Удалить имя класса из узлов тегов, используя HtmlAgilityPack

c# html html-agility-pack xpath

Вопрос

Мне нужно избавиться от определенных имен классов из html, например:

<table class="removeme"></table>

Мне нужен код, который может удалить указанный класс «removeeme» и html после очистки, будет выглядеть так:

<table></table>

Также имейте в виду, что переданный html может содержать что-то вроде:

<table class="removeme leaveme"></table>

и после очистки он должен выглядеть следующим образом:

<table class="leaveme"></table>

Принятый ответ

Вы можете попытаться решить эту проблему в два этапа, сначала получите все узлы, имеющие только атрибут класса «removeeme», а затем удалите из них весь атрибут класса:

//*[normalize-space(@class)='removeme']

Затем на следующем шаге получите все узлы с классом removeme и некоторыми другими классами, а затем removeme из атрибута class:

//*[
     normalize-space(@class)!='removeme'
        and
     contains(concat(' ', normalize-space(@class), ' '), ' removeme ')
   ]

первое условие в XPath выше означает получение всех узлов, которые не обрабатываются на шаге 1, а второе условие эквивалентно XPath для селектора css .removeme

Вот полный пример консоли:

var xml = @"<root>
    <table class=""removeme""></table>
    <table class=""removeme leaveme""></table>
    <table class="" removeme ""></table>
</root>";
var doc = new HtmlDocument();
doc.LoadHtml(xml);
var removemeOnly = doc.DocumentNode.SelectNodes("//*[normalize-space(@class)='removeme']");
foreach (HtmlNode node in removemeOnly)
{
    node.Attributes["class"].Remove();
}
var containsRemoveme =
    doc.DocumentNode.SelectNodes("//*[normalize-space(@class)!='removeme' and contains(concat(' ', normalize-space(@class), ' '), ' removeme ')]");
foreach (HtmlNode node in containsRemoveme)
{
    node.Attributes["class"].Value = node.Attributes["class"].Value.Replace("removeme", "");
}
//print formatted HTML output (don't use this for non XML-compliant HTML)
Console.WriteLine(XDocument.Parse(doc.DocumentNode.OuterHtml));


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow