gpt4 book ai didi

c# - HtmlAgilityPack - 追加节点

转载 作者:行者123 更新时间:2023-11-28 02:25:36 27 4
gpt4 key购买 nike

我一直在尝试使用 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'

我已经搜索了解决方案,但其他问题中建议的解决方案不适用于我的问题。

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

最佳答案

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

您需要将子节点添加到span 元素。但是您实际上将它添加到 text 元素,该元素是 span 元素的子节点。出于某种原因,如果将子元素添加到 text 元素,HtmlAgilityPack 将失败。

因此,您需要删除 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);
}
}
}

关于c# - HtmlAgilityPack - 追加节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54320206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com