Eliminando elemento por nombre de clase con HTMLAgilityPack c #

.net c# html-agility-pack xpath xslt

Pregunta

Estoy usando el paquete de agilidad html para leer el contenido de mi documento html en una cadena, etc. Después de hacer esto, me gustaría eliminar los elementos certian en ese contenido por su clase, sin embargo, me estoy topando con un problema.

Mi Html se ve así:

<div id="wrapper">
    <div class="maincolumn" >
        <div class="breadCrumbContainer">
            <div class="breadCrumbs">
            </div>
        </div>

        <div class="seo_list">
            <div class="seo_head">Header</div>
        </div>

Content goes here...
</div>

Ahora, he usado un selector de xpath para obtener todo el contenido dentro de la propiedad InnerHtml y lo he usado así:

            node = doc.DocumentNode.SelectSingleNode("//div[@id='wrapper']");
            if (node != null)
            {
                pageContent = node.InnerHtml;
            }

Desde este punto, me gustaría eliminar el div con la clase de "breadCrumbContainer", sin embargo, al usar el código de abajo, aparece el error: "Nodo" "no se encontró en la colección"

            node = doc.DocumentNode.SelectSingleNode("//div[@id='wrapper']");
            node = node.RemoveChild(node.SelectSingleNode("//div[@class='breadCrumbContainer']"));

            if (node != null)
            {
                pageContent = node.InnerHtml;
            }

¿Alguien puede arrojar algo de luz sobre esto por favor? Soy bastante nuevo en Xpath, y realmente nuevo en la biblioteca HtmlAgility.

Gracias,

Dave

Respuesta aceptada

Es porque RemoveChild solo puede eliminar a un hijo directo, no a un nieto. Intenta esto en su lugar:

    HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='breadCrumbContainer']");
    node.ParentNode.RemoveChild(node);

Respuesta popular

Esta es una tarea súper simple para XSLT:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
  "div[@class='breadCrumbContainer'
     and
       ancestor::div[@id='wrapper']
      ]
  "/>
</xsl:stylesheet>

cuando esta transformación se aplica en el documento XML proporcionado (con otro <div> agregado y envuelto en un elemento superior <html> para hacerlo más desafiante y realista):

<html>
 <div id="wrapper">
    <div class="maincolumn" >
        <div class="breadCrumbContainer">
            <div class="breadCrumbs"></div>
        </div>
        <div class="seo_list">
            <div class="seo_head">Header</div>
        </div>  Content goes here...
    </div>
 </div>
 <div>
   Something else here
 </div>
</html>

Se produce el resultado deseado, correcto:

<html>
  <div id="wrapper">
    <div class="maincolumn">
      <div class="seo_list">
        <div class="seo_head">Header</div>
      </div>  Content goes here...
    </div>
  </div>
  <div>
   Something else here
 </div>
</html>


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é