使用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));



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因