尝试写入时出错,然后在 Windows Phone 8 应用程序中读取 XML 文件
本文关键字:应用程序 Phone 读取 文件 XML Windows 出错 然后 | 更新日期: 2023-09-27 17:57:06
>已编辑:添加自发布此内容以来收集的所有信息。
嗨,堆垛机!我第一次尝试使用Visual Studio 2013和WP8 SDK制作Metro风格的Windows Phone 8应用程序。
此应用应该能够在存储在应用文件夹中的 XML 文件中存储来自用户的一些数据。
这是它应该做的:
用户以正常方式使用应用,然后保存数据。我想将其添加到已经创建的 dataFile.xml 文件中,该文件仅使用 xml 声明行和根元素创建。然后,如果用户想要查看他保存的内容,应用应获取 XML 文件中的数据并显示它。
下面是基本的 XML 文件:
<?xml version="1.0" encoding="utf-8" ?>
<itemList>
</itemList>
以及我编写数据的代码:(此处编辑修改)
var isoFileStream = new IsolatedStorageFileStream("Saves''itemList.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite, store); //Where store is my definition of IsolatedStorageFile
var xDoc = XDocument.Load(isoFileStream);
var newItem = new XElement("Item",
new XElement("Name", ItemName.Text),
//all other elements here
new XElement("Method", method));
xDoc.Root.Add(newItem);
xDoc.Root.Save(isoFileStream);
isoFileStream.Close();
多亏了隔离存储和 ISETool.exe,我能够在使用上面的代码写入其中后检索 xml 文件。结果如下:
<?xml version="1.0" encoding="utf-8" ?> <itemList></itemList><?xml version="1.0" encoding="utf-8"?>
<itemList>
<Item>
<Name>My Item</Name>
<Method>Item method</Method>
</Item>
</itemList>
因此,为了恢复,代码加载了上面显示的 xml 文件,使用 xDoc.Root 检测根元素,并在其中添加了该项。但是,在保存时,它会重新创建 XML 声明和根元素,使文件结构不正确,因此无法使用。为什么?问得好。如何解决?这就是我想知道的。
知道吗?
提前非常感谢:)
我终于找到了如何处理这个问题,所以我回答了我自己的问题,以防有人遇到同样的问题。
问题就在这里:
xDoc.Root.Save(isoFileStream);
这将使用用于加载 XML 文件的先前内容的文件流来保存代码中格式化的 XDocument。但是 XDocument.Save 函数用于格式化 XML 文件,使其即使文件为空也能使用。因此,它将数据写入文件末尾,通过添加两个声明使结构不正确。
解决方案是使用 XDocument.load(fileStream) 在 var xDoc 中收集 XML 内容,然后关闭流并打开一个新流,并将 FileMode 选项设置为 创建,以覆盖现有文件:
var isoFileStream = new IsolatedStorageFileStream("Saves''itemList.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite, store);
var xDoc = XDocument.Load(isoFileStream);
isoFileStream.Close();
isoFileStream = new IsolatedStorageFileStream("Saves''itemList.xml", FileMode.Create, FileAccess.ReadWrite, store);
var newItem = new XElement("Item",
new XElement("Name", ItemName.Text),
//all other elements here
new XElement("Method", method));
xDoc.Root.Add(newItem);
xDoc.Save(isoFileStream);
isoFileStream.Close();
使用它可以完美地工作。感谢那些回答帮助的人:)