2011-09-01 54 views
7

我正在替换某个与特定窗口小部件有关的头部脚本。我希望能够找到与位于评论之间的小部件有关的所有节点。另外,我想轻松去除与指定窗口小部件(包括起始和结束注释任何代码HTMLAgilityPack选择注释之间的节点

的插入和删除代码如下所示:

<!-- WidgetScript_WidgetName --> 

    <script src="Widgets/jquery.somecode.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
    $(function() { 
     $('.someid).dothis({parameter, avatar_size: 48, count: 6}); 
     }); 
    </script> 
    <link href="Widgets/jquery.somecode.css" media="all" rel="stylesheet" type="text/css"/> 

<!--WidgetScript_WidgetName End--> 

回答

9

尝试使用以下:

var startNode = document.DocumentNode.SelectSingleNode("//comment()[contains(., 'WidgetScript_WidgetName')]"); 
var endNode = document.DocumentNode.SelectSingleNode("//comment()[contains(., 'WidgetScript_WidgetName End')]"); 
int startNodeIndex = startNode.ParentNode.ChildNodes.IndexOf(startNode); 
int endNodeIndex = endNode.ParentNode.ChildNodes.IndexOf(endNode); 

var nodes = startNode.ParentNode.ChildNodes.Where((n, index) => index >= startNodeIndex && index <= endNodeIndex).Select(n => n); 
+0

完美地工作。谢谢! – steve

3

我建议是这样的:

 var head = document.DocumentNode.SelectSingleNode("html/head"); 

     var nodes = new List<HtmlNode>(); 

     bool isComment = false; 
     foreach (var node in head.ChildNodes.ToList()) 
     { 
      if (node.NodeType == HtmlNodeType.Comment && 
       node.InnerText.Contains("WidgetScript_WidgetName")) 
      { 
       isComment = !isComment; 
       node.Remove(); 
      } 
      else if (isComment) 
      { 
       nodes.Add(node); 
       node.Remove(); 
      } 
     } 

     Console.WriteLine(head.InnerHtml); 

这祛瘀在两个评论(和评论本身)之间的每个节点。

+0

我实际上做了这个和@jdavies的组合来查找和删除元素。 – steve