Element nach Klassennamen mit HTMLAgilityPack c # entfernen

.net c# html-agility-pack xpath xslt

Frage

Ich benutze das HTML-Agility-Pack, um den Inhalt meines HTML-Dokuments in einen String usw. zu lesen. Nachdem dies geschehen ist, möchte ich die certianischen Elemente in diesem Inhalt nach ihrer Klasse entfernen, stolpere jedoch über ein Problem.

Mein Html sieht so aus:

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

Jetzt habe ich einen xpath-Selektor benutzt, um den gesamten Inhalt innerhalb der zu erhalten und benutzte die InnerHtml-Eigenschaft wie folgt:

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

Von diesem Punkt möchte ich das Div mit der Klasse "BrotCrumbContainer" entfernen, aber wenn ich den Code unten verwende, bekomme ich den Fehler: "Knoten" "wurde nicht in der Sammlung gefunden"

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

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

Kann jemand bitte etwas Licht darauf werfen? Ich bin ziemlich neu in Xpath und wirklich neu in der HtmlAgility-Bibliothek.

Vielen Dank,

Dave

Akzeptierte Antwort

Das liegt daran, dass RemoveChild nur ein direktes Kind und kein Enkelkind entfernen kann. Versuchen Sie es stattdessen:

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

Beliebte Antwort

Dies ist eine sehr einfache Aufgabe für 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>

Wenn diese Transformation auf das bereitgestellte XML-Dokument angewendet wird (mit einem weiteren <div> -Element, das in ein <html> top-Element <html> , um es schwieriger und realistischer zu machen):

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

das gewünschte, korrekte Ergebnis wird erzeugt:

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum