删除元素后,结构化XML文档不正确

时间:2014-03-07 09:42:07

标签: c# xml windows-phone-8

当我从文件中删除XML后尝试加载Element文件时,会显示以下错误: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. Line 9, position 10.我的代码出了什么问题?

这是我的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<data>
   <booze>booze1</booze>
   <booze>booze2</booze>
   <booze>booze3</booze>
   <booze>booze4</booze>
</data>

我的代码:

using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication())
{
    using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("favorites.xml", FileMode.Open, file))
   {
       XDocument xDoc = XDocument.Load(stream, LoadOptions.None);
       // delete node
       xDoc.Descendants("data").Elements("booze").Where(x => x.Value == favorite).DescendantsAndSelf().Remove();
       xDoc.Save(stream);
    }
}

1 个答案:

答案 0 :(得分:3)

我的猜测是,当你第一次运行代码时,删除成功,你的XDoc包含:   <?xml version="1.0" encoding="utf-8"?> <data> <booze>booze1</booze> <booze>booze2</booze> <booze>booze4</booze> </data>

,但在调用XDoc.Save时,只需将其附加到 favorites.xml 文件即可。之后, favorites.xml 文件包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<data>
   <booze>booze1</booze>
   <booze>booze2</booze>
   <booze>booze3</booze>
   <booze>booze4</booze>
</data><?xml version="1.0" encoding="utf-8"?>
<data>
  <booze>booze1</booze>
  <booze>booze2</booze>
  <booze>booze4</booze>
</data>

这就是为什么所有后续文件加载都会抛出错误的原因。你应该做的是覆盖文件,而不是附加到它。想到的第一种方法是关闭流,使用Mode.Truncate打开它,然后保存XDoc。或者您可以删除并重新创建该文件。我对IsolatedStorageFiles并不熟悉,所以这是一个疯狂的猜测。