异步 XML 写入正在清除文件
Async XML write is clearing file
我正在开发一个 class 来创建或打开一个 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 文件为空,包括删除创建时添加的元素。
我做错了什么?
很难说没有 a good, minimal, complete code example 能可靠地重现问题。但是,您的代码似乎有两个不同的问题:
- 当 XML 文件已经存在时,您根本不需要实际 加载 它,留下
XMLDocObject
引用一个空文档。 (事实上 , storageFile != null
案例似乎完全不合适;它不仅没有像我期望的那样从 storageFile
加载 XML,它实际上 重新检索 storageFile
对象通过再次调用 GetFileAsync()
)。
- 您的
addSyncTime()
方法创建了新元素,但从未将它们添加到 XML 文档树中。
鉴于以上情况,我希望程序行为为:
- 第一次 运行 程序时,会创建 XML 文档。
- 您以后任何时候 运行 程序(除非您删除 XML 文档),尝试更新 XML 文档都会清空该文档。
在这两种情况下,我都不希望添加 new SyncTime
元素。第一次 运行 程序时,您将获得根 SyncTimes
元素及其初始 id
和 dateTime
子元素,但没有任何 SyncTime
元素。之后,XML 文档将被清空,您仍然不会得到任何新的 SyncTime
元素。
如果以上内容未能解决您的问题,请按照我上面提供的 link 中所述提供良好的代码示例。
我正在开发一个 class 来创建或打开一个 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 文件为空,包括删除创建时添加的元素。
我做错了什么?
很难说没有 a good, minimal, complete code example 能可靠地重现问题。但是,您的代码似乎有两个不同的问题:
- 当 XML 文件已经存在时,您根本不需要实际 加载 它,留下
XMLDocObject
引用一个空文档。 (事实上 ,storageFile != null
案例似乎完全不合适;它不仅没有像我期望的那样从storageFile
加载 XML,它实际上 重新检索storageFile
对象通过再次调用GetFileAsync()
)。 - 您的
addSyncTime()
方法创建了新元素,但从未将它们添加到 XML 文档树中。
鉴于以上情况,我希望程序行为为:
- 第一次 运行 程序时,会创建 XML 文档。
- 您以后任何时候 运行 程序(除非您删除 XML 文档),尝试更新 XML 文档都会清空该文档。
在这两种情况下,我都不希望添加 new SyncTime
元素。第一次 运行 程序时,您将获得根 SyncTimes
元素及其初始 id
和 dateTime
子元素,但没有任何 SyncTime
元素。之后,XML 文档将被清空,您仍然不会得到任何新的 SyncTime
元素。
如果以上内容未能解决您的问题,请按照我上面提供的 link 中所述提供良好的代码示例。