Удаление элемента по имени класса с помощью HTMLAgilityPack c # - PullRequest
6 голосов
/ 07 марта 2011

Я использую html agility pack для чтения содержимого моего 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 для получения всего содержимого внутри и использовал свойство InnerHtml следующим образом:

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

С этого момента я хотел бы удалить div с классом "breadCrumbContainer", однако при использовании кода ниже я получаю ошибку: "Node" "не найден в коллекции"

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

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

Кто-нибудь может пролить свет на это, пожалуйста?Я довольно новичок в Xpath и действительно плохо знаком с библиотекой HtmlAgility.

Спасибо,

Дейв

Ответы [ 2 ]

11 голосов
/ 07 марта 2011

Это потому, что RemoveChild может удалить только прямого потомка, но не внучатого. Попробуйте вместо этого:

    HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='breadCrumbContainer']");
    node.ParentNode.RemoveChild(node);
0 голосов
/ 08 марта 2011

Это очень простая задача для 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>, чтобы сделать его более сложным и реалистичным):

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

желаемый, правильный результат получается:

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