HTMLAgilityPack을 사용하여 클래스 이름별로 요소 제거 c #

.net c# html-agility-pack xpath xslt

문제

html 민첩성 팩을 사용하여 HTML 문서의 내용을 문자열 등으로 읽습니다.이 작업이 끝나면 해당 내용의 certian 요소를 해당 클래스에서 제거하고 싶습니다. 그러나 문제가 발생했습니다.

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

이제 xpath selector를 사용하여 InnerHtml 속성을 다음과 같이 사용했습니다.

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

이 시점에서 "breadCrumbContainer"클래스로 div를 제거하고 싶습니다. 그러나 아래 코드를 사용할 때 "노드"가 컬렉션에서 발견되지 않았습니다 "라는 오류가 발생합니다.

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

누구든지이 부분을 좀 밝힐 수 있습니까? 저는 Xpath를 처음 접했고 HtmlAgility 라이브러리가 새로 도입되었습니다.

감사,

데이브

수락 된 답변

RemoveChild는 그랜드 자식이 아닌 직접 자식만을 제거 할 수 있기 때문입니다. 대신 다음을 시도하십시오.

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

인기 답변

이것은 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>

이 변환이 제공된 XML 문서에 적용될 때 (다른 <div> 가 추가되고 <html> 상위 요소로 래핑되어보다 어렵고 현실적이됩니다)

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

원하는 정확한 결과가 생성됩니다.

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



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.