我正在尝试使用UWP从存储在存储文件中的xml文件中删除元素。我的问题是doc.Save命令只将完整的doc添加到文件的末尾而不是替换它。 我试图搜索som替换选项,但没有成功。
所以问题实际上是两部分: 1.有没有更好的方法从xml文件中删除元素然后完全替换它? 2.如果不能如何替换文件?
public async Task DeleteSingleById(int id)
{
StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file = await folder.GetFileAsync("Data.xml");
Stream stream = await file.OpenStreamForWriteAsync();
using (stream)
{
XDocument doc = XDocument.Load(stream);
doc.Descendants("Companies").Elements("Company").FirstOrDefault(x => x.Elements("Id").Any(e => e.Value == id.ToString())).Remove();
doc.Save(stream);
}
}
更新1: 这解决了问题,但看起来不太好。对改进的任何评论都会很棒。
public async Task DeleteSingleById(int id)
{
StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file = await folder.GetFileAsync("Data.xml");
Stream stream = await file.OpenStreamForWriteAsync();
XDocument doc = XDocument.Load(stream);
using (stream)
{
doc.Descendants("Companies").Elements("Company").FirstOrDefault(x => x.Elements("Id").Any(e => e.Value == id.ToString())).Remove();
}
await file.DeleteAsync();
file = await folder.CreateFileAsync("Data.xml", CreationCollisionOption.ReplaceExisting);
stream = await file.OpenStreamForWriteAsync();
using (stream)
{
doc.Save(stream);
}
}
答案 0 :(得分:3)
这里的问题是您忘记将位置重置为当前流中的begin,因此新的XML文档将附加到原始文件中。
要解决此问题,我们可以在将Stream.SetLength保存到流之前使用XDocument方法,如下所示。在将当前流的长度设置为零时,它将清除当前流并自动将位置重置为开始。
public async Task DeleteSingleById(int id)
{
StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file = await folder.GetFileAsync("Data.xml");
Stream stream = await file.OpenStreamForWriteAsync();
using (stream)
{
XDocument doc = XDocument.Load(stream);
doc.Descendants("Companies").Elements("Company").FirstOrDefault(x => x.Elements("Id").Any(e => e.Value == id.ToString())).Remove();
stream.SetLength(0);
doc.Save(stream);
}
}