选择注释之间的节点

本文关键字:节点 之间 注释 选择 | 更新日期: 2023-09-27 18:07:20

我正在替换一些属于特定小部件的头部脚本。我希望能够找到与位于评论之间的小部件相关的所有节点。此外,我还想轻松地删除与指定小部件相关的任何代码(包括开始和结束注释)。

插入和删除的代码看起来像这样:

<!-- 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-->

选择注释之间的节点

试着使用以下命令:

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);

我建议这样做:

        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);

这将删除两个注释之间的每个节点(以及注释本身)。