异步XML写入是清除文件

时间:2015-03-27 19:49:41

标签: c# xml windows-store-apps async-await

我正在创建一个创建或打开xml文件的类:

namespace QTabs
{
    public class DataLayer
    {
        XmlDocument XMLDocObject = new XmlDocument();
        StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
        StorageFile storageFile;
        string xmlFile = "DataStore.xml";
        public DataLayer()
        {
            loadXML();
        }

        public async void loadXML()
        {
            //if XML doc doesnt exist create it
            try
            {
                storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(xmlFile);
            }
            catch (FileNotFoundException)
            {
                storageFile = null;
            }
            if (storageFile == null)
            {

                storageFile = await storageFolder.CreateFileAsync(xmlFile);
                // Manipulate the xml document.
                var root = XMLDocObject.CreateElement("SyncTimes");
                XMLDocObject.AppendChild(root);
                var childTag1 = XMLDocObject.CreateElement("id");
                var childTag2 = XMLDocObject.CreateElement("dateTime");
                root.AppendChild(childTag1);
                root.AppendChild(childTag2);
                await XMLDocObject.SaveToFileAsync(storageFile);
            }
            else
            {
                storageFile = await storageFolder.GetFileAsync(xmlFile);
            }
        }
        public async void addSyncTime()
        {
            XmlElement x1 = XMLDocObject.CreateElement("SyncTime");
            XmlElement x11 = XMLDocObject.CreateElement("id");
            x11.InnerText = "1";
            x1.AppendChild(x11);
            XmlElement x12 = XMLDocObject.CreateElement("dateTime");
            x12.InnerText = DateTime.Now.ToString();
            x1.AppendChild(x12);
            await XMLDocObject.SaveToFileAsync(storageFile);
        }
    }
}

我的问题是使用上面的addSyncTime()方法。运行时,它会导致XML文件为空,包括删除创建时添加的元素。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

很难说没有a good, minimal, complete code example可靠地再现问题。但是,您的代码似乎有两个不同的问题:

  1. 当XML文件已经存在时,您不必费心实际加载它,让XMLDocObject引用空文档。 (事实上​​,storageFile != null案例似乎完全不合适;它不仅没有像我期望的那样从storageFile加载XML,它实际上重新检索 {通过再次调用storageFile来对象{1}}。
  2. 您的GetFileAsync()方法会创建新元素,但绝不会将它们添加到XML文档树中。
  3. 鉴于上述情况,我希望程序行为为:

    • 第一次运行程序时,会创建XML文档。
    • 随后您运行程序时(除非您删除XML文档),尝试更新XML文档将清空文档。

    在任何情况下,我都不希望添加新的 addSyncTime()元素。第一次运行该程序时,您将获得根SyncTime元素及其初始SyncTimesid子元素,但不会获得任何dateTime元素。之后,XML文档将被清空,您仍然无法获得任何新的SyncTime元素。

    如果上述问题无法解决您的问题,请提供一个很好的代码示例,如我在上面提供的链接中所述。