为每个HTML标记添加数字属性

时间:2011-07-05 02:43:41

标签: c# html-agility-pack

我需要为文档中的每个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; }
    }

那么,有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您需要过滤节点,因此您只需选择元素。出于某种原因,浏览HTML Agility Pack中的后代包括其他节点,如文档和文本节点不正确。由于您盲目地向所有节点添加属性,因此会阻塞非元素节点的序列化。

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