2013年5月27日 星期一

[筆記] XmlElement can not call SetAttribute in foreach?

C#對我而言只是會用而已,有些語法還不是很了解,今天遇到一個問題不清楚是C#的限制還是Bug?

我使用XmlDocument讀取xml文件,並檢查文件中的Bookmark元素們的Bookmarkname屬性,當屬性不存在或為空字元(“”)時視為舊版本,從Filename屬性讀出資料更新Bookmarkname屬性。

原本是使用C#的foreach來檢查每個Bookmark元素

   1: var elements = _xmlProject.GetElementsByTagName("Bookmark");
   2: foreach(var element in elements)
   3: {
   4:     String bookmarkname = element.GetAttribute(@"Bookmarkname");
   5:     if (bookmarkname == null || bookmarkname == "")
   6:     {
   7:         bookmarkname = element.GetAttribute(@"Filename");
   8:         element.SetAttribute(@"Bookmarkname", bookmarkname);
   9:     }
  10: }

不過當發現元素為舊版格式不存在Bookmarkname屬性而呼叫SetAttribute後,下一筆element讀取時一定會發生Invalidate exception,若改為for語法就一切正常,更改後為



   1: var elements = _xmlProject.GetElementsByTagName("Bookmark");
   2: int count = elements.Count;
   3: for(int i=0 ; i<count ; i++)
   4: {
   5:     var element = elements[i] as XmlElement;
   6:  
   7:     String bookmarkname = element.GetAttribute(@"Bookmarkname");
   8:     if (bookmarkname == null || bookmarkname == "")
   9:     {
  10:         bookmarkname = element.GetAttribute(@"Filename");
  11:         element.SetAttribute(@"Bookmarkname", bookmarkname);
  12:     }
  13: }

所以是C#的foreach並不是list的形式所以資料集合不能有記憶體配置的變化?還只是單純的bug?

沒有留言:

張貼留言