Добавьте div в HTML послев с # - PullRequest
       21

Добавьте div в HTML послев с #

0 голосов
/ 11 октября 2019

Требование: добавить собственный html после тега body в строке

Я решил с помощью htmlagilitypack так:

 StringBuilder sb = new StringBuilder();
 sb.Append(customStringWithHtmlContent)
 HtmlDocument htmlDoc = new HtmlDocument();
 htmlDoc.LoadHtml(sb.ToString());
 // Create new node from newcontent
 HtmlNode newNode = HtmlNode.CreateNode("<div>" + someStringWithAdditionalContent + "</div>");
 // Get body node
 HtmlNode body = htmlDoc.DocumentNode.SelectSingleNode("//body");
 if (body != null)
    {// Add new node as first child of body
      body.PrependChild(newNode);
    }
 var docContent = htmlDoc.DocumentNode.InnerHtml;

Выглядит хорошо, но на некоторых html-страницах структура html изменяется, закрывается divтеги перемещены и html выглядит ужасно

второе решение:

 if (sb.ToString().Contains("<body>"))
    {
      sb.Replace("<body>", "<body><div>" + someStringWithAdditionalContent + "</div>");
    }

выглядит хорошо, но не является решением для тела с атрибутами, такими как

<body style="someAttr:value ..." ...>

некоторые идеи? другие решения?

1 Ответ

0 голосов
/ 11 октября 2019

RegEx? Возможно, есть более элегантный способ, но основная идея:

    string input = "<body style=\"someAttr\"><tag>sdsdsa</tag></body>";
    Regex Pattern = new Regex(@"(<body.*?>)(.*?)(<\/body>)", RegexOptions.Compiled);

    var updatedText = Pattern.Replace(input, match =>
    {
        string newMatch = match.Groups[2].Value;
        string newContent = "<div>" + "someStringWithAdditionalContent" + "</div>";
        return match.Groups[1].Value + newContent + newMatch + match.Groups[3].Value;
    });
    Console.WriteLine(updatedText);

Вывод:

<body style="someAttr"><div>someStringWithAdditionalContent</div><tag>sdsdsa</tag></body>
...