HTMLAgilityPack 주석 사이의 노드 선택

c# comments html-agility-pack

문제

특정 위젯과 관련된 일부 헤드 스크립트를 대체하려고합니다. 주석 사이에있는 위젯과 관련된 모든 노드를 찾을 수 있기를 원합니다. 또한 특정 위젯과 관련된 모든 코드 (시작 및 끝 주석 포함)를 쉽게 제거하고자합니다.

삽입 및 제거 된 코드는 다음과 같습니다.

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

그러면 두 개의 주석 (및 주석 자체) 사이의 모든 노드가 제거됩니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.