Удаление элемента по имени класса с помощью HTMLAgilityPack c #

.net c# html-agility-pack xpath xslt

Вопрос

Я использую hmml 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.

Благодаря,

Дейв

Принятый ответ

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

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


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему