Как изменить значение в файле XML, хранящемся в изолированном хранилище? - PullRequest
0 голосов
/ 17 декабря 2011

Я создаю приложение для Windows Phone 7, и у меня возникли проблемы с изменением значений в моем 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);

Есть идеи, как мне тогда это сделать? Приветствия.

1 Ответ

2 голосов
/ 17 декабря 2011

Вы используете 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. В подобных ситуациях стоит попытаться воспроизвести и отладить проблему в настольном режиме, поскольку обычно это происходит быстрее, чем при использовании эмулятора или реального устройства.

...