2012-07-07 22 views
2

這裏是我的簡單的HTML:的Html敏捷包 - 通過ID或者類中刪除標籤

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

我想與ID或類名爲「divToRemove」 刪除div的,然後我要選擇僅在div稱爲「mainDiv」(在HtmlNode中)。

結果應該是:

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

我怎樣才能做到這一點使用HTML敏捷性包?

謝謝!

+0

到目前爲止你有什麼代碼? – Ruel 2012-07-07 02:33:23

回答

4

以下代碼是根據您的需要改編的this Html Agility Pack forum page。從本質上講,我們將抓住所有的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']"); 
0

個人的節點,我更喜歡使用HtmlAgilityPack的LINQ的方法。選擇將很長,但相對簡單,只需選擇具有正確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(); 
+0

這是否適合你?這給了我一個'Object Reference Not Set'錯誤,因爲並不是所有的div都定義了'class'屬性。 – Shiva 2016-06-08 05:13:54

+0

GetAttributeValue的第二個參數是在沒有「class」屬性時返回的內容。這就是爲什麼我把它設置爲string.Empty。這種方法沒有對象引用問題。您可能想驗證這是您的不良參考,但... – 2016-06-09 02:13:26