2016-12-04 10 views
1

UWPを使用してストレージファイルに格納されたXMLファイルから要素を削除しようとしています。私の問題は、doc.Saveコマンドは、ファイルを置き換えるのではなく、ファイルの最後に完全なドキュメントを追加するだけです。 私はsom replaceオプションを検索しようとしましたが、成功しませんでした。UWPを使用してXMLファイルを置換するXMLファイル内の要素

質問は実際には2つの部分です: 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

このアップデートで問題が解決しました。ありがとうございます! –

関連する問題