Rimuovi il nome della classe dai nodi tag usando HtmlAgilityPack

c# html html-agility-pack xpath

Domanda

Ho bisogno di eliminare nomi di classi specifici da html, ad esempio:

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

Ho bisogno di un codice snipped che possa rimuovere la classe specificata "rimuovi" e html dopo la pulizia sarà simile a questo:

<table></table>

Tieni anche presente che html passato può contenere qualcosa come:

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

e dopo la pulizia dovrebbe apparire come:

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

Risposta accettata

Puoi provare a risolverlo in due passaggi, in primo luogo ottenere tutti i nodi con solo l'attributo di classe 'removeme`, quindi rimuovere l'intero attributo di classe da loro:

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

Quindi, nel passaggio successivo, ottieni tutti i nodi con classe di removeme e alcune altre classi, quindi removeme dall'attributo di classe:

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

la prima condizione in XPath sopra indica ottenere tutti i nodi che non vengono elaborati nel passaggio 1 e la seconda condizione è l'XPath equivalente per il selettore css .removeme

Ecco l'esempio completo della console:

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

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow