C# 向每个HTML标记添加number属性

C# 向每个HTML标记添加number属性,c#,html-agility-pack,C#,Html Agility Pack,我需要向文档中的每个HTML标记添加一个数字递增的自定义属性,类似于,但仅在HTML中,而不是XML文件中 我试图用HTML Agility Pack来完成它,下面是我的代码: HtmlDocument htmldoc = new HtmlDocument(); htmldoc.LoadHtml(text); var num = 1; foreach (HtmlNode node in htmldoc.DocumentNode.De

我需要向文档中的每个HTML标记添加一个数字递增的自定义属性,类似于,但仅在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类中遇到了堆栈溢出异常。 我尝试了几种通过更改类来纠正此错误的方法,但均无效

你有什么建议吗

---编辑--- 因此,异常只是写入控制台的“堆栈溢出”

“进程因StackOverflowException而终止。”

由于是堆栈溢出,因此不可能获取任何堆栈值。 以下是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; }
    }
//
///获取或设置节点的文本。
/// 
公共字符串文本
{
得到
{
如果(_text==null)
{
return base.OuterHtml;
}
返回文本;
}
设置{u text=value;}
}

那么,有什么想法吗?

您需要过滤节点,以便只选择元素。由于某些原因,在HTML Agility Pack中遍历子体时,会错误地包含其他节点,如文档和文本节点。由于您盲目地向所有节点添加属性,因此会妨碍序列化非元素节点

// note: Descendants() and DescendantNodes() is equivalent (unfortunately)
var query = htmldoc.DocumentNode.Descendants()
    .Where(node => node.NodeType == HtmlNodeType.Element);

你能发布异常和堆栈跟踪吗?@Richard我明天下班后会发布,我刚回家,手头没有代码——谢谢你的建议@Richard我添加了一些我可以得到的信息。我现在无法查看,但谢谢你的回答。我认为这是唯一的答案,所以我把它标记为正确的:)有同样的问题。Fix对我很有用!谢谢:)