使用HtmlAgilityPack从标记节点中删除类名
本文关键字:删除 节点 HtmlAgilityPack 使用 | 更新日期: 2023-09-27 18:20:15
我需要从html中去掉特定的类名,例如:
<table class="removeme"></table>
我需要一个代码剪辑谁可以删除指定的类"removeme"和html清洗后将看起来像这样:
<table></table>
还要记住,传递的html可以包含以下内容:
<table class="removeme leaveme"></table>
清洗后应显示为:
<table class="leaveme"></table>
您可以尝试通过两个步骤来解决此问题,首先获取所有只有"removeme"class属性的节点,然后从中删除整个class属性:
//*[normalize-space(@class)='removeme']
然后在下一步中,获取所有具有removeme
类和其他一些类的节点,然后从类属性中去掉removeme
:
//*[
normalize-space(@class)!='removeme'
and
contains(concat(' ', normalize-space(@class), ' '), ' removeme ')
]
上面XPath中的第一个条件表示获取步骤1中未处理的所有节点,第二个条件是css选择器.removeme
的等效XPath
以下是完整的控制台示例:
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));