Elimine el nombre de la clase de los nodos de etiquetas usando HtmlAgilityPack

c# html html-agility-pack xpath

Pregunta

Necesito deshacerme de nombres de clase específicos de html, por ejemplo:

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

Necesito un código cortado que pueda eliminar la clase "removeme" especificada y el html después de la limpieza se verá así:

<table></table>

También tenga en cuenta que html pasado puede contener algo como:

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

y después de la limpieza debe aparecer como:

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

Respuesta aceptada

Puede intentar solucionar esto en dos pasos, primero obtenga todos los nodos que tengan solo el atributo de clase 'removeme`, luego elimine el atributo de clase completo de ellos:

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

Luego, en el siguiente paso, obtenga todos los nodos que tengan clase removeme y algunas otras clases, luego removeme del atributo class:

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

la primera condición en el XPath anterior significa obtener todos los nodos que no se procesan en el paso 1, y la segunda condición es el XPath equivalente para el selector de CSS .removeme

Aquí está el ejemplo completo de la consola:

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

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow