使用HtmlAgilityPack从标记节点中删除类名

c# html html-agility-pack xpath

我需要从html中删除特定的类名,例如:

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

我需要一个可以删除指定类“removeme”的代码剪切,清理后的html将如下所示:

<table></table>

还要记住,传递的html可以包含以下内容:

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

清洁后,它应显示为:

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

一般承认的答案

您可以尝试通过两个步骤解决此问题,首先获取所有节点仅具有'removeme`类属性,然后从中删除整个类属性:

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

然后在下一步中,获取具有removeme类和其他一些类的所有节点,然后从class属性中删除removeme

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

上面的XPath中的第一个条件意味着获取在步骤1中未处理的所有节点,第二个条件是css选择器的等效XPath .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