2011-07-05 54 views
3

我需要爲文檔中的每個HTML標記添加一個自定義屬性,其編號與this question類似,但僅限於HTML,而不是XML文件。向每個HTML標記添加數字屬性

我試着用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敏捷性包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; } 
    } 

因此,任何想法?

+0

你能發佈異常和堆棧跟蹤嗎? –

+0

@Richard我明天下班了,我剛回到家,手上沒有代碼 - 謝謝你的建議! –

+0

@Richard我添加了一些我可以得到的信息。 –

回答

1

您需要過濾節點,以便只選擇元素。出於某種原因,瀏覽HTML Agility Pack中的後代包含文檔和文本節點等其他節點的錯誤。由於您盲目地向所有節點添加屬性,因此會扼殺序列化非元素節點。

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

我現在無法檢查,但謝謝你的回答。我建議這是唯一的答案,所以我把它標記爲正確:) –

+0

有同樣的問題。修復對我很好!謝謝 :) – uggeh