尝试写入时出错,然后在 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 声明和根元素,使文件结构不正确,因此无法使用。为什么?问得好。如何解决?这就是我想知道的。

知道吗?

提前非常感谢:)

尝试写入时出错,然后在 Windows Phone 8 应用程序中读取 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();

使用它可以完美地工作。感谢那些回答帮助的人:)