我需要为文档中的每个HTML标记添加一个带有递增编号的自定义属性,类似于this question,但仅限于HTML,而不是XML文件。
我尝试使用HTML Agility Pack完成它,这是我的代码:
HtmlDocument htmldoc = new HtmlDocument();
htmldoc.LoadHtml(text);
var num = 1;
foreach (HtmlNode node in htmldoc.DocumentNode.DescendantNodes())
{
node.Attributes.Add("gist_num",(num++).ToString());
}
var numberedfilename = Path.GetDirectoryName(fname) + @"\" + Path.GetFileNameWithoutExtension(fname) + "-num.htm";
htmldoc.Save(numberedfilename);
但是我在HTML Agility Pack HtmlTextNode类中遇到了堆栈溢出异常。 我尝试了几种方法来通过更改类来纠正这个错误,但无济于事。
你在这里建议什么?
---编辑--- 因此,异常只是写入控制台的“Stack Overflow”。
“由于StackOverflowException,进程终止。”
由于它是Stack Overflow,因此无法获得任何堆栈值。 以下是VS显示此异常发生的代码:
/// <summary>
/// Gets or Sets the text of the node.
/// </summary>
public string Text
{
get
{
if (_text == null)
{
return base.OuterHtml;
}
return _text;
}
set { _text = value; }
}
那么,有什么想法吗?
答案 0 :(得分:1)
您需要过滤节点,因此您只需选择元素。出于某种原因,浏览HTML Agility Pack中的后代包括其他节点,如文档和文本节点不正确。由于您盲目地向所有节点添加属性,因此会阻塞非元素节点的序列化。
// note: Descendants() and DescendantNodes() is equivalent (unfortunately)
var query = htmldoc.DocumentNode.Descendants()
.Where(node => node.NodeType == HtmlNodeType.Element);