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>

我想刪除名為“divToRemove”的ID或類的div,然後我只想選擇名為“mainDiv”的div(在HtmlNode中)。

結果應該是:

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

我怎麼能用Html Agility Pack做到這一點?

謝謝!

一般承認的答案

以下代碼是根據此Html Agility Pack論壇頁面改編的,以滿足您的需求。基本上,我們將獲取所有div然後循環遍歷它們並檢查他們的類或他們的id匹配。如果它在那裡刪除它。

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']");

熱門答案

就個人而言,我更喜歡使用HtmlAgilityPack的Linq方法。 select會很長,但相對簡單 - 只需選擇具有正確id和/或類的節點,然後在其上調用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();



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因