Добавление атрибута номера к каждому тегу HTML - PullRequest
3 голосов
/ 05 июля 2011

Мне нужно добавить пользовательский атрибут с увеличивающимся числом к ​​каждому тегу HTML в документе, аналогично этому вопросу , но только в HTML, а не в файле XML.

Я попытался сделать это с помощью Agility Pack в HTML, вот мой код:

        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; }
    }

Итак, есть идеи?

1 Ответ

1 голос
/ 16 октября 2011

Вам нужно отфильтровать узлы, чтобы вы выбирали только элементы. По некоторым причинам, обход потомков в HTML Agility Pack включает другие узлы, такие как узлы документа и текста, неправильно. Поскольку вы вслепую добавляете атрибуты ко всем узлам, он блокирует сериализацию неэлементных узлов.

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