2016-12-04 74 views
1

我想从使用UWP的存储文件中存储的xml文件中删除元素。我的问题是,doc.Save命令只会将完整的文档添加到文件的最后而不是替换它。 我试图搜索索姆替换选项,但没有成功。使用UWP替换XML文件或删除XML文件中的元素

所以这个问题实际上是两个部分: 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); 
     } 
    } 

回答

3

这里的问题是,您忘记将位置重置为当前流的开始位置,因此新的XML文档被追加到原始文件。

为了解决这个问题,我们可以在将XDocument保存到如下所示的流之前使用Stream.SetLength方法。将当前流的长度设置为零时,它将清除当前流并自动将位置重置为开始位置。

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); 
    } 
} 
+0

其实这并没有工作。它只在文件的开始处写入所有内容,并在最后留下任何未被覆盖的东西。 –

+0

@SamuelWahlberg是的,只有重新设置位置才能解决问题。在这里,我们需要清除当前流以进行重写。我已经更新了我的答案,现在应该可以开展工作。感谢您的支持。 ;) –

+0

更新解决了问题,谢谢! –