我一直在尝试使用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"> </span></p><p class="csDBEB299A"><span class="cs15323895"> </span></p><p class="csDBEB299A"><span class="cs15323895">Table name: Table 1</span></p><p class="csDBEB299A"><span class="cs15323895"> </span></p><p class="csDBEB299A"><a name="_GoBack"></a><span class="cs15323895"> </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'
我一直在寻找解决方案,但其他问题中提出的解决方案不适用于我的问题。
我已经尝试抓住了,但是它并没有给我遇到错误的那一行。谢谢
答案 0 :(得分:0)
htmlDoc.DocumentNode.Descendants()
不仅返回span
,div
等常用元素,还返回特殊的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);
}
}
}