Paquete de agilidad HTML - Eliminar etiquetas por ID o clase

c# html-agility-pack

Pregunta

Aquí está mi HTML simplificado:

<html>
  <body>
    <div id="mainDiv">
       <div id="divToRemove"></div>
       <div id="divToKeep"></div>
       <div class="divToRemove"></div>
       <div class="divToRemove"></div>
    </div>
  </body>
</html>

Quiero eliminar los divs con ID o clase llamada "divToRemove" y luego quiero seleccionar solo el div llamado "mainDiv" (en un HtmlNode).

Los resultados deben ser:

   <div id="mainDiv">
       <div id="divToKeep"></div>
   </div>

¿Cómo puedo hacer eso usando Html Agility Pack?

¡Gracias!

Respuesta aceptada

El siguiente código está adaptado de esta página del foro Html Agility Pack para satisfacer sus necesidades. Esencialmente, tomaremos todos los divs y luego los recorreremos y verificaremos su clase o su id para una coincidencia. Si está allí quítalo.

var divs = htmldoc.DocumentNode.SelectNodes("//div");
if (divs != null)
{
    foreach (var tag in divs)
    {
        if (tag.Attributes["class"] != null && string.Compare(tag.Attributes["class"].Value, "divToRemove", StringComparison.InvariantCultureIgnoreCase) == 0)
        {
            tag.Remove();
        } else if(tag.Attributes["id"] != null && string.Compare(tag.Attributes["id"].Value, "divToRemove", StringComparison.InvariantCultureIgnoreCase) == 0) {
            tag.Remove();
        }
    }
}

También puede combinar estas declaraciones if en una declaración if grande, pero pensé que esta lectura era mejor para la respuesta.

Finalmente, seleccione el nodo que estaba buscando ...

var mainDiv = htmldoc.DocumentNode.SelectSingleNode("//div[@id='mainDiv']");

Respuesta popular

Personalmente, prefiero usar los métodos Linq de HtmlAgilityPack. La selección será larga, pero relativamente sencilla: solo seleccione los nodos con el id y / o clase correctos y luego llame al método Remove() .

foreach (var node in doc.DocumentNode.Descendants("div")
    .Where(n => n.Id.Equals("divToRemove", StringComparison.InvariantCultureIgnoreCase) 
        || n.GetAttributeValue("class", string.Empty).Equals("divToRemove", StringComparison.InvariantCultureIgnoreCase)))
    node.Remove();
HtmlNode mainNode = doc.DocumentNode.Descendants("div").Where(n => n.Id.Equals("mainDiv", StringComparison.InvariantCultureIgnoreCase).First();


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué