Suppression d'élément par nom de classe avec HTMLAgilityPack c #

.net c# html-agility-pack xpath xslt

Question

J'utilise le pack d'agilité html pour lire le contenu de mon document html dans une chaîne, etc. Une fois cette opération effectuée, j'aimerais supprimer les éléments certian contenus dans ce contenu par leur classe, mais je tombe par hasard sur un problème.

Mon code HTML ressemble à ceci:

<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>

Maintenant, j'ai utilisé un sélecteur xpath pour obtenir tout le contenu de la et utiliser la propriété InnerHtml comme ceci:

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

De ce point, je voudrais supprimer le div avec la classe de "breadCrumbContainer", cependant en utilisant le code ci-dessous, j'obtiens l'erreur: "Node" "n'a pas été trouvé dans la collection"

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

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

Quelqu'un peut-il nous éclairer s'il vous plaît? Je suis assez nouveau sur Xpath et vraiment nouveau sur la bibliothèque HtmlAgility.

Merci,

Dave

Réponse acceptée

En effet, RemoveChild ne peut supprimer qu'un enfant direct, pas un grand-enfant. Essayez ceci à la place:

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

Réponse populaire

C'est une tâche super simple pour 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>

lorsque cette transformation est appliquée sur le document XML fourni (avec un autre <div> et un élément <html> top pour le rendre plus réaliste et plus stimulante)

<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>

le résultat recherché est correct:

<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>


Related

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