HTMLAgilityPack Wählen Sie Knoten zwischen Kommentaren

c# comments html-agility-pack

Frage

Ich ersetze ein Kopfskript, das zu einem bestimmten Widget gehört. Ich möchte in der Lage sein, alle Knoten zu finden, die sich auf das Widget zwischen den Kommentaren beziehen. Außerdem möchte ich jeden Code entfernen, der sich auf das angegebene Widget bezieht (einschließlich des Start- und Endkommentars).

Der Code zum Einfügen und Entfernen sieht folgendermaßen aus:

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

Akzeptierte Antwort

Versuchen Sie Folgendes:

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

Beliebte Antwort

Ich würde so etwas vorschlagen:

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

Dies entfernt jeden Knoten zwischen zwei Kommentaren (und den Kommentaren selbst).



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum