Html Agility Pack - удалить теги по ID или классу

c# html-agility-pack

Вопрос

Вот мой упрощенный HTML:

<html>
  <body>
    <div id="mainDiv">
       <div id="divToRemove"></div>
       <div id="divToKeep"></div>
       <div class="divToRemove"></div>
       <div class="divToRemove"></div>
    </div>
  </body>
</html>

Я хочу удалить div с идентификатором или классом с именем «divToRemove», а затем я хочу выбрать только div, называемый «mainDiv» (в HtmlNode).

Результаты должны быть следующими:

   <div id="mainDiv">
       <div id="divToKeep"></div>
   </div>

Как я могу это сделать, используя Html Agility Pack?

Благодаря!

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

Следующий код является адаптированным с этой страницы форума Html Agility Pack в соответствии с вашими потребностями. По сути, мы будем захватывать все div, а затем прокручиваем их и проверяем их класс или их идентификатор для соответствия. Если он там, удалите его.

var divs = htmldoc.DocumentNode.SelectNodes("//div");
if (divs != null)
{
    foreach (var tag in divs)
    {
        if (tag.Attributes["class"] != null && string.Compare(tag.Attributes["class"].Value, "divToRemove", StringComparison.InvariantCultureIgnoreCase) == 0)
        {
            tag.Remove();
        } else if(tag.Attributes["id"] != null && string.Compare(tag.Attributes["id"].Value, "divToRemove", StringComparison.InvariantCultureIgnoreCase) == 0) {
            tag.Remove();
        }
    }
}

Вы можете также объединить эти операторы if в один большой оператор if, но я подумал, что это лучше для ответа.

Наконец, выберите узел, который вы искали ...

var mainDiv = htmldoc.DocumentNode.SelectSingleNode("//div[@id='mainDiv']");

Популярные ответы

Лично я предпочитаю использовать методы Linq для HtmlAgilityPack. Выбор будет длинным, но относительно простым - просто выберите узлы с правильным идентификатором и / или классом, а затем вызовите на нем метод Remove() .

foreach (var node in doc.DocumentNode.Descendants("div")
    .Where(n => n.Id.Equals("divToRemove", StringComparison.InvariantCultureIgnoreCase) 
        || n.GetAttributeValue("class", string.Empty).Equals("divToRemove", StringComparison.InvariantCultureIgnoreCase)))
    node.Remove();
HtmlNode mainNode = doc.DocumentNode.Descendants("div").Where(n => n.Id.Equals("mainDiv", StringComparison.InvariantCultureIgnoreCase).First();


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow