2012-07-07 75 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