Внедрение HTML в определенном месте с использованием HTMLAgilityPack - PullRequest
0 голосов
/ 03 октября 2018

Меня попросили вставить группу HTML в конкретную точку в документе HTML, и я пытался сделать это с помощью HTMLAgilityPack.Рекомендованный способ сделать это, насколько я могу судить, состоит в том, чтобы выполнить синтаксический анализ с использованием узлов и заменить / удалить соответствующие узлы.

Пока это мой код

//Load original HTML
var originalHtml = new HtmlDocument();
originalHtml.Load(@"C:\Temp\test.html");

//Load inject HTML
var inject = new HtmlDocument();
inject.Load(@"C:\Temp\Temp\inject.html");
var injectNode = HtmlNode.CreateNode(inject.Text);

//Get all HTML nodes to inject/delete
var nodesToDelete = originalHtml.DocumentNode.SelectNodes("//p[@style='page-break-after:avoid']");
var countToDelete = nodesToDelete.Count();

//loop through stuff to remove
int count = 0;
foreach (var nodeToDelete in nodesToDelete)
{
    count++;
    if (count == 1)
    {
        //replace with inject HTML
        nodeToDelete.ParentNode.ReplaceChild(injectNode, nodeToDelete);
    }
    else if (count <= countToDelete)
    {
        //remove, as HTML already injected
        nodeToDelete.ParentNode.RemoveChild(nodeToDelete);
    }
}

Что яЯ обнаружил, что исходный HTML не обновляется правильно, похоже, что он только внедряет узел родительского уровня, который является простым и ни один из дочерних узлов.

Любая помощь ??

Спасибо,

Патрик.

1 Ответ

0 голосов
/ 04 октября 2018

Что ж, я не мог понять, как это сделать с помощью HTMLAgilityPack, возможно, в большей степени из-за отсутствия у меня понимания узлов больше, чем чего бы то ни было, но я нашел простое решение, используя AngleSharp.

//Load original HTML into document
var parser = new HtmlParser();
var htmlDocument = parser.Parse(File.ReadAllText(@"C:\Temp\test.html"));

//Load inject HTML as raw text
var injectHtml = File.ReadAllText(@"C:\Temp\inject.html")

//Get all HTML elements to inject/delete
var elements = htmlDocument.All.Where(e => e.Attributes.Any(a => a.Name == "style" && a.Value == "page-break-after:avoid"));

//loop through stuff to remove
int count = 1;
foreach (var element  in elements)
{
    if (count == 1)
    {
        //replace with inject HTML
        element.OuterHtml = injectHtml;
    }
    else
    {
        //remove, as HTML already injected
        element.Remove();
    }
    count++;
}


//Re-write updated file
File.WriteAllText(@"C:\Temp\test_updated.html", string.Format("{0}{1}{2}{3}","<html>",htmlDocument.Head.OuterHtml,htmlDocument.Body.OuterHtml,"</html>"));
...