HTML Agility Pack-在两个注释之间替换HTML

时间:2019-03-20 13:49:35

标签: c# html html-agility-pack

我正在使用HTML Agility Pack构建具有不同功能的库。

其中之一是:

  • 搜索HTML中“开始注释标签”和“结束注释标签”之间包含的所有HTML部分
  • 将所有HTML替换为与一个搜索字符串匹配的HTML部分

例如:

  • 我需要搜索<!-- data-example-start起始标记和<!-- data-example-end结束标记之间的HTML部分。两者都是关键字(注释以这些关键字开头)
  • 要替换的HTML部分是包含关键字“ hello”的部分。

<body>
    <p>Title 
    </p>
    <!-- data-example-start-try_1 -->
    <div> 
    </div>
    <span id="hello"> Hi
    </span>
    <!-- data-example-end-try_1 -->
    <!-- data-example-start-goodbye 2-->
    <div> 
    <span id="bye"> Bye
    </span>
    </div>
    <p>
    </p>
    <!-- data-example-end-goodbye 2-->
</body>

在这种情况下,我希望替换<!-- data-example-start-try_1 --><!-- data-example-end-try_1 -->之间的第一个HTML部分,因为里面有我要搜索的搜索词“ hello”。

如何在Html Agility Pack中选择两个HTML注释之间包含的HTML部分?

预先感谢

1 个答案:

答案 0 :(得分:0)

这里是一个在线示例,显示了如何在注释之间获取节点:

https://dotnetfiddle.net/JlkMot

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
var docNode = doc.DocumentNode.InnerHtml;

var descendants = doc.DocumentNode.Descendants().ToList();

var startNode = descendants.FindIndex(x => x.InnerHtml == "<!-- data-example-start-try_1 -->");
var endEnd = descendants.FindIndex(x => x.InnerHtml == "<!-- data-example-end-try_1 -->");

if (startNode != -1 && endEnd != 1)
{
    var betweenNodes = descendants.GetRange(startNode + 1, endEnd - startNode - 1);

    foreach (var node in betweenNodes)
    {
        // show 2 times "Hi", once for the span, once for the text
        Console.WriteLine(node.InnerHtml);
    }
}