使用UWP替换XML文件或删除XML文件中的元素

时间:2016-12-04 18:43:28

标签: c# xml uwp

我正在尝试使用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);
        }
    }

1 个答案:

答案 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);
    }
}