Html Agility Pack - замена HTML между двумя комментариями - PullRequest
1 голос
/ 20 марта 2019

Я использую Html Agility Pack для создания библиотеки с различными функциями.

Один из них:

  • поиск в HTML всех HTML-частей, содержащихся между «тегом начального комментария» и «тегом конечного комментария»
  • заменить весь HTML для части HTML, которая соответствует одной строке поиска

Например:

  • Мне нужно искать части HTML, содержащиеся между <!-- data-example-start начальным тегом и <!-- data-example-end конечным тегом. Оба являются ключевыми словами (комментарии начинаются с этих ключевых слов)
  • 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>

В этом случае я ожидаю заменить первую часть HTML, содержащуюся между <!-- data-example-start-try_1 --> и <!-- data-example-end-try_1 -->, потому что внутри есть искомое слово "привет", которое я ищу.

Как выбрать в Html Agility Pack части HTML, содержащиеся между двумя комментариями HTML?

Заранее спасибо

1 Ответ

0 голосов
/ 21 марта 2019

Вот онлайн пример, который показывает, как получить узлы между комментариями:

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