2016-12-04 88 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

更新解決了問題,謝謝! –