HtmlAgilityPack-追加节点

时间:2019-01-23 04:50:57

标签: c# html html-agility-pack

我一直在尝试使用HTML Agility Pack在HTML中附加一个新节点。

这是我的样本HTML

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>
        </title>
        <style type="text/css">
            .csDBEB299A{text-align:left;text-indent:0pt;margin:0pt 0pt 0pt 0pt;line-height:14.65pt;mso-line-height-rule:exactly}
            .cs15323895{color:#000000;background-color:transparent;font-family:Verdana;font-size:10pt;font-weight:normal;font-style:normal;}
        </style>
    </head>
    <body>
        <p class="csDBEB299A"><span class="cs15323895">This is a sample</span></p><p class="csDBEB299A"><span class="cs15323895">&nbsp;</span></p><p class="csDBEB299A"><span class="cs15323895">&nbsp;</span></p><p class="csDBEB299A"><span class="cs15323895">Table name: Table 1</span></p><p class="csDBEB299A"><span class="cs15323895">&nbsp;</span></p><p class="csDBEB299A"><a name="_GoBack"></a><span class="cs15323895">&nbsp;</span></p></body>
</html>

条件是,如果innerHtml以"Table name:"开头,则应附加一个节点。

例如我有这个

<span class="cs15323895">Table name: Table 1</span>

它将变成

<span class="cs15323895">Table name: Table 1<h2>This is h2 heading</h2></span>

这是有关如何使用HTML Agility Pack附加子级的文档

https://html-agility-pack.net/append-child

这是我的代码

                var htmlDoc = new HtmlDocument();
                htmlDoc.Load(htmlFile);

                foreach (var item in htmlDoc.DocumentNode.Descendants())
                {
                    if (!item.HasChildNodes)
                    {
                        var text = item.InnerHtml;
                        var textTosearch = "table name:";
                        if (text.ToLower().StartsWith(textTosearch))
                        {

                            HtmlNode h2Node = HtmlNode.CreateNode("<h2> This is h2 heading</h2>");
                            item.AppendChild(h2Node);
                        }
                    }
                }

但是当我将其保存到文件中时出现错误

        htmlDoc.Save(@"test.html");

以下是错误:

Process is terminated due to StackOverflowException.
An unhandled exception of type 'System.StackOverflowException'

我一直在寻找解决方案,但其他问题中提出的解决方案不适用于我的问题。

我已经尝试抓住了,但是它并没有给我遇到错误的那一行。谢谢

1 个答案:

答案 0 :(得分:0)

htmlDoc.DocumentNode.Descendants()不仅返回spandiv等常用元素,还返回特殊的text元素,这些元素表示html元素内的任何文本

您需要将子节点添加到span元素中。但是实际上您将其添加到text元素的子节点span元素中。由于某些原因,如果将子元素添加到HtmlAgilityPack元素,则text失败。

因此,由于目标元素具有子if (!item.HasChildNodes)元素并排除了text元素,因此您需要删除text条件。这样的事情应该起作用:

foreach (var item in htmlDoc.DocumentNode.Descendants())
{
    if (item.NodeType != HtmlNodeType.Text)
    {
        var text = item.InnerHtml;
        var textTosearch = "table name:";
        if (text.ToLower().StartsWith(textTosearch))
        {

            HtmlNode h2Node = HtmlNode.CreateNode(@"<h2> This is h2 heading</h2>");
            item.AppendChild(h2Node);
        }
    }
}