【问题标题】:How do I add a new element to the existing XML file on Windows Phone 7 using LINQ to XML?如何使用 LINQ to XML 向 Windows Phone 7 上的现有 XML 文件添加新元素?
【发布时间】:2011-09-21 17:25:28
【问题描述】:

在过去的几个小时里,我一直在努力在 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 文件的小示例应用程序。当我尝试运行它时,我遇到了一个非常熟悉的错误:

意外的 XML 声明。 XML 声明必须是文档中的第一个节点,并且之前不允许出现空白字符。

这是该主题的链接: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 更改内置操作并复制到输出目录的属性,但这没有用。我尝试添加:

isFile.Dispose();

我也尝试添加条件语句:

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

但他找不到文件。

我的生活从来没有这么困顿过。请告诉我我还能尝试什么。

【问题讨论】:

    标签: c# xml linq windows-phone-7 windows-phone-7.1


    【解决方案1】:

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

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

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

    或者,加载文档并关闭流,然后打开一个 new 流到同一个文件。请注意,您应该使用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);
        } 
    }
    

    【讨论】:

    • 不幸的是,我的代码没有t go past "XDocument loadedDoc = XDocument.Load(stream);" Im 得到“缺少根元素”,所以我什至无法尝试。
    • 我尝试按照您的建议使用 using 语句执行此操作,但我再次在 XDocument 加载文档 = XDocument.Load(stream); 上收到“缺少根元素”。一般来说,将我的 XML 文件加载到流中似乎有问题。
    • @Booyaches:这意味着你的文件是空的。
    • @SLaks:我“手动”创建了这个文档,所以我知道它不是空的,如果我做对了。我ll post a little screenshot underneath. EDIT: Ok I am sorry I cant发图了,我是新用户。
    • 这里是link 我说我会放上的截图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多