XDocument写入Duplicated xml

我有一个方法,它将XML加载到XDocument并修改其元素然后保存。 但是当我重装它。 我收到了这个错误:

意外的XML声明。 XML声明必须是文档中的第一个节点,并且不允许在其前面显示空白字符。

我检查XML并看到XDocument没有保存更改但创建重复并保存。

它保存旧的和新的一个像这个例子xml:

   HERE City Lens b0a0ac22-cf9e-45ba-8120-815450e2fd71 /Icon/herecitylens.png Unknown HERE Uknown     HERE City Lens b0a0ac22-cf9e-45ba-8120-815450e2fd71 /Icon/herecitylens.png 1.0.0.0 HERE Uknown  

这里是我用来修改和保存XML的代码:

 using (Stream stream = storage.OpenFile("APPSDATA.xml", FileMode.Open, FileAccess.ReadWrite)) { //var xdoc = XDocument.Load("APPSDATA.xml"); var xdoc = XDocument.Load(stream, LoadOptions.None); var listapp = from c in xdoc.Descendants("Ungdung") select c; foreach (XElement app in listapp) { var xElement = app.Element("Name"); if (xElement != null) progressIndicator.Text = "Checking " + xElement.Value + "..."; var element = app.Element("Id"); if (element != null) { var appId = element.Value; var appVersion = await GetAppsVersion(appId); app.Element("Version").Value = appVersion.ToString(); } } xdoc.Save(stream); } 

我怎么解决这个问题 ?

看起来您在当前文件内容的末尾添加了修改过的文档。 这就是为什么你不能再次解析它。

我会将读取写入部分拆分为不同的using语句:

 XDocument xdoc; using (Stream stream = storage.OpenFile("APPSDATA.xml", FileMode.Open, FileAccess.Read)) { xdoc = XDocument.Load(stream, LoadOptions.None); } var listapp = from c in xdoc.Descendants("Ungdung") select c; foreach (XElement app in listapp) { var xElement = app.Element("Name"); if (xElement != null) progressIndicator.Text = "Checking " + xElement.Value + "..."; var element = app.Element("Id"); if (element != null) { var appId = element.Value; var appVersion = await GetAppsVersion(appId); app.Element("Version").Value = appVersion.ToString(); } } using (Stream stream = storage.OpenFile("APPSDATA.xml", FileMode.Truncate, FileAccess.Write)) { xdoc.Save(stream); } 

在第二个using语句上设置FileMode.Truncate将清除以前的文件内容,应该解决您的问题。