Supprimer le nom de classe des nœuds de balises à l'aide de HtmlAgilityPack

c# html html-agility-pack xpath

Question

Je dois me débarrasser de certains noms de classe du code HTML, par exemple:

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

J'ai besoin d'un code snipp qui peut supprimer la classe spécifiée "removeme" et HTML après le nettoyage ressemblera à ceci:

<table></table>

N'oubliez pas non plus que le code HTML passé peut contenir quelque chose comme:

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

et après le nettoyage, il devrait apparaître comme:

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

Réponse acceptée

Vous pouvez essayer de résoudre ce problème en deux étapes, commencez par obtenir tous les nœuds ayant uniquement l'attribut de classe 'removeme`, puis supprimez-les de l'attribut de classe entier:

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

Ensuite, dans l’étape suivante, récupérez tous les nœuds ayant la classe removeme et quelques autres classes, puis supprimez removeme de l’attribut class:

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

la première condition dans XPath ci-dessus signifie que tous les nœuds qui ne sont pas traités à l'étape 1 sont .removeme , et la deuxième condition est l'équivalent de XPath pour le sélecteur css .removeme

Voici l'exemple complet de la 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

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow