2011-12-17 90 views
0

我正在創建一個Windows Phone 7應用程序,並且在更改xml文件(位於獨立存儲內部)中的值時遇到了一些問題。 我的方法是在這裏:如何修改存儲在獨立存儲器內的xml文件中的值?

public void updateItemValueToIsoStorage(string id, 
             string itemAttribute, 
             string value) 
{ 
    using (var isoStorage = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
     using (var stream = isoStorage.OpenFile(
          "items.xml", FileMode.Open, FileAccess.ReadWrite)) 
     { 
      XDocument xml = XDocument.Load(stream, LoadOptions.None); 
      //According to given parameters, 
      //set the correct attribute to correct value. 
      var data = from c in xml.Descendants("item") 
         where c.Attribute("id").Value == id 
         select c; 
      foreach (Object i in data) 
      { 

       xml.Root.Attribute(itemAttribute).SetValue(value); 

      }     
     } 
    } 
} 

和孤立的存儲在我的XML文件是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<items> 
<item id="0" title="Milk" image="a.png" lastbought="6" lastingtime="6" /> 
<item id="1" title="Cheese" image="b.png" lastbought="2" lastingtime="20" /> 
<item id="2" title="Bread" image="c.png" lastbought="3" lastingtime="8" /> 
</items> 

我得到這一行一個NullReferenceException:

xml.Root.Attribute(itemAttribute).SetValue(value); 

任何想法如何那我該怎麼做? 乾杯。

回答

2

您正在使用xml.Root.Attribute正在嘗試查找根元素上的屬性 - 它不存在的位置。你也完全忽略了迭代器中的i變量。

我想你的意思是:

var data = from c in xml.Descendants("item") 
      where (string) c.Attribute("id") == id 
      select c; 

foreach (XElement element in data) 
{ 
    element.Attribute(itemAttribute).SetValue(value); 
} 

注意通過在查詢中使用從XAttribute明確轉化爲string,不會有異常,如果有不具備任何item元素id屬性。

值得注意的是,這與Windows Phone 7或獨立存儲真的沒有任何關係 - 即使使用硬編碼的XML,使用桌面框架從控制檯應用程序獲得與原始代碼完全相同的錯誤。對於類似的情況,值得在桌面設置中重現和調試問題,因爲它通常比使用仿真器或真實設備更快。

+0

是的,它似乎工作。我不知道我在那裏有什麼樣的腦凍結。謝謝。 – Baburo 2011-12-18 17:14:12