Rimozione dell'elemento in base al nome della classe con HTMLAgilityPack c #

.net c# html-agility-pack xpath xslt

Domanda

Sto usando il pacchetto di agilità html per leggere il contenuto del mio documento html in una stringa, eccetera. Dopo aver fatto questo, vorrei rimuovere gli elementi certian in quel contenuto dalla loro classe, tuttavia mi imbatto in un problema.

Il mio Html ha questo aspetto:

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

Ora, ho usato un selettore xpath per ottenere tutto il contenuto e usato la proprietà InnerHtml in questo modo:

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

Da questo punto, vorrei rimuovere il div con la classe di "breadCrumbContainer", tuttavia quando si utilizza il codice sottostante, ottengo l'errore: "Nodo" "non è stato trovato nella raccolta"

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

Qualcuno può far luce su questo per favore? Sono abbastanza nuovo per Xpath e davvero nuovo per la libreria HtmlAgility.

Grazie,

Dave

Risposta accettata

È perché RemoveChild può rimuovere solo un figlio diretto, non un nipotino. Prova questo invece:

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

Risposta popolare

Questo è un compito semplicissimo per 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>

quando questa trasformazione viene applicata sul documento XML fornito (con l'aggiunta di un altro <div> e incapsulato in un elemento superiore <html> per renderlo più complesso e realistico):

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

il risultato voluto e corretto è prodotto:

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché