HTMLAgilityPack Seleccionar nodos entre comentarios

c# comments html-agility-pack

Pregunta

Estoy reemplazando un script de cabeza que pertenece a un widget específico. Quiero poder encontrar todos los nodos relacionados con ese widget ubicado entre los comentarios. Además, quiero eliminar fácilmente cualquier código relacionado con el widget especificado (incluidos el comentario inicial y final).

El código insertado y eliminado se verá así:

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

Respuesta aceptada

Trate de usar lo siguiente:

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

Respuesta popular

Sugeriría algo como esto:

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

Esto elimina cada nodo entre dos comentarios (y los comentarios mismos).



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué