gpt4 book ai didi

c# - 如何使用 LINQ to XML 将新元素添加到 Windows Phone 7 上的现有 XML 文件?

转载 作者:数据小太阳 更新时间:2023-10-29 02:37:17 24 4
gpt4 key购买 nike

在过去的几个小时里,我一直在努力使用 Windows Phone 7 上的 LINQ to XML。我只是想将新元素添加到现有的 XML 文件中。

XElement newItem = new XElement("item",new XAttribute("id",3), 
new XElement("content","Buy groceries"),
new XElement("status","false"));

IsolatedStorageFile isFile = IsolatedStorageFile.GetUserStoreForApplication();
IsolatedStorageFileStream stream = new IsolatedStorageFileStream("/Items.xml", System.IO.FileMode.Open, isFile);

XDocument loadedDoc = XDocument.Load(stream);
loadedDoc.Add(newItem);
loadedDoc.Save(stream);

通常我会遇到非常奇怪的行为。有时我收到错误消息“IsolatedStorageFileStream 不允许操作。”。有时是“缺少根元素”,有时是“意外的 XML 声明。XML 声明必须是文档中的第一个节点,并且它之前不允许出现空白字符。”例如,如果我将 System.IO.FileMode.Open 更改为 Create 我会得到“根元素丢失”但除此之外似乎没有任何模式根据哪个错误发生。

似乎是我的 XML 文件导致了问题:

<?xml version="1.0" encoding="utf-8" ?>
<items>
<item id="1">
<content>Get groceries</content>
<status>false</status>
</item>
<item id="2">
<content>Wash your car</content>
<status>true</status>
</item>
</items>

没有比这更简单的了,我绝对确定在实际 XML 文件中的声明之前没有任何空格。为了让这一切变得更加奇怪,我下载了使用相同技术写入 XML 文件的小示例应用程序。当我尝试运行它时,出现了一个非常熟悉的错误:

Unexpected XML declaration. The XML declaration must be the first node in the document, and no white space characters are allowed to appear before it.

这是该主题的链接:http://mobileworld.appamundi.com/blogs/petevickers/archive/2010/12/06/windows-phone-7-linq-to-xml-corruption.aspx/

昨天我安装了 Windows Phone SDK 7.1 BETA。这可能是导致问题的原因吗?


问题似乎出在隔离存储中定位 xml 文件。我在里面创建了全新的项目和新的 xml 文件。

那是我唯一的代码:

// Constructor
public MainPage()
{
InitializeComponent();
var isFile = IsolatedStorageFile.GetUserStoreForApplication();
var stream = isFile.OpenFile("file.xml", System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite);
}

我仍然得到:在 IsolatedStorageFileStream 上不允许操作。我尝试进入 file.xml 的属性,更改 Built 操作并复制到输出目录,但这没有用。我尝试添加:

isFile.Dispose();

我还尝试添加条件语句:

if (isFile.FileExists("file.xml"))...

但是他找不到文件。

我从来没有像现在这样困在我的生活中。请告诉我我还能尝试什么。

最佳答案

您正在尝试保存到您从中加载的同一流 - 但没有将其“倒带”到开头。我不知道独立存储流是否可搜索,但您可以尝试将代码更改为:

XDocument loadedDoc = XDocument.Load(stream);
loadedDoc.Add(newItem);
stream.Position = 0;
loadedDoc.Save(stream);

请注意,虽然在这种情况下我们不需要在添加内容时重置流的大小,但在其他情况下您可能需要这样做以避免文件末尾出现“剩余”位.

或者,加载文档并关闭流,然后打开到同一文件的流。请注意,您应该在每次使用后使用 using 语句关闭流,例如

using (var isFile = IsolatedStorageFile.GetUserStoreForApplication())
{
XDocument loadedDoc;
using (var stream = isFile.OpenFile("/Items.xml", FileMode.Open))
{
loadedDoc = XDocument.Load(stream);
}
loadedDoc.Add(newItem);
using (var stream = isFile.OpenFile("/Items.xml", FileMode.Create))
{
loadedDoc.Save(stream);
}
}

关于c# - 如何使用 LINQ to XML 将新元素添加到 Windows Phone 7 上的现有 XML 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7503976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com