C# 尝试在Windows Phone 8应用程序中写入然后读取XML文件时出错
编辑:添加我发布此信息后收集的所有信息 嗨,斯塔克尔斯! 我第一次尝试使用Visual Studio 2013和WP8 SDK开发Metro风格的windows phone 8应用程序 此应用程序应该能够将来自用户的一些数据存储在应用程序文件夹中存储的XML文件中 以下是它应该做的: 用户以正常方式使用应用程序,然后保存数据。我想将它添加到一个dataFile.xml文件中,该文件已经创建,只有xml声明行和根元素。然后,如果用户想查看他保存的内容,应用程序应该获取XML文件中的数据并显示出来 以下是基本的XML文件:C# 尝试在Windows Phone 8应用程序中写入然后读取XML文件时出错,c#,xml,windows-phone-8,C#,Xml,Windows Phone 8,编辑:添加我发布此信息后收集的所有信息 嗨,斯塔克尔斯! 我第一次尝试使用Visual Studio 2013和WP8 SDK开发Metro风格的windows phone 8应用程序 此应用程序应该能够将来自用户的一些数据存储在应用程序文件夹中存储的XML文件中 以下是它应该做的: 用户以正常方式使用应用程序,然后保存数据。我想将它添加到一个dataFile.xml文件中,该文件已经创建,只有xml声明行和根元素。然后,如果用户想查看他保存的内容,应用程序应该获取XML文件中的数据并显示出来
<?xml version="1.0" encoding="utf-8" ?>
<itemList>
</itemList>
多亏了IsolatedStorage和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.loadfileStream收集var xDoc中的XML内容,然后关闭流并打开一个新的流,并将FileMode选项设置为Create,以覆盖现有文件:
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();
这是完美的工作使用这个。感谢那些为他们提供帮助的人:那么,在您编写文件之后,您是否查看了该文件的外观?我怀疑基本上是两个XML文件粘在一起——在写入之前,您需要返回到流的开头,或者更好的做法是,读取文件,关闭流,然后重新打开进行写入。事实上,如果WP8支持这些调用,那么只需XDocument.LoadSaves/itemList.xml和更高版本的doc.SaveSaves/itemList.xml就可以了。您可以使用手机powertools访问设备或模拟器上部署的应用程序的本地存储。我发现它们有助于检查实际写入文件的内容:-@JonSkeet我实际上试图不使用文件流,它用于加载,但不用于保存,说它不能使用字符串而不是编写器,所以我尝试使用文件流。如果不是每次我使用管理员权限启动它时都崩溃,并且如果不是使用管理员权限启动它时不显示任何模拟器,我很想尝试一下电动工具。。我将尝试找到显示xml内容的解决方案;看看会发生什么。由于它的智能性,它只显示内容,而不是XML声明。在使用ToString进行任何修改之前,我试图访问它。它工作了,并在第一次修改后立即停止工作。它似乎正确地写入了添加的第一项:ItemName 1…其他元素。。。它一定是弄乱了声明,但我不明白为什么保存后的XML文件的内容是通过编辑初始帖子添加的。
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();