0

最初にもう一度言いたいのですが、私のプラットフォームはWindows ストア アプリケーションです(一部のユーザーは、私がデスクトップ環境について話していると考えて、重複したトピックとして質問を閉じているためです)。xml ドキュメントがあり、次の方法で要素を削除します。

public async void DeleteDocument(Word deletedItem)
{
   StorageFile storageFile = await _fileloc.StorageFile();
   var file = await storageFile.OpenAsync(FileAccessMode.ReadWrite);
   Stream inStream = file.AsStreamForWrite();
   XDocument xDoc = XDocument.Load(inStream);
   xDoc.Descendants("Word").Single(p =>((Guid)p.Element("Id")).Equals(deletedItem.Id)).Remove();
   xDoc.Save(inStream);   
}

要素は正常に削除されましたが、 xDocument を保存すると、新しい xDocument が次のように最後の xml ファイルに追加されます

<XML ....>
<Word id="1">
     <Item x="...."/>
     <Item x="...."/>
</Word>
<Word id="2">
     <Item x="...."/>
     <Item x="...."/>
</Word>
</XML><XML ....>
<Word Id="2">
    <Item x="...."/>
     <Item x="...."/>
</Word>
</XML>

私にアドバイスしてください。あなたの助けに感謝します。

アップデート:

ジム・オニールのアドバイスの後、保存された文書は次のようになります

<XML ....>
<Word id="1">
     <Item x="...."/>
     <Item x="...."/>
</Word>
 x="...."/>
     <Item x="...."/>
</Word>
</XML>
4

1 に答える 1

0

読み取り/書き込みアクセス用にファイルを開き、XML をロードすると、ファイル ポインターはファイルの末尾になります。したがって、保存すると、ファイルポインタがどこにあるか、つまりファイルの最後に書き込みが開始されます。

これがうまくいくかどうかを確認してください:

var file = await storageFile.OpenAsync(FileAccessMode.ReadWrite);
using (Stream inStream = file.AsStreamForWrite())
{
    XDocument xDoc = XDocument.Load(inStream);
    xDoc.Descendants("word").Remove();
    inStream.Seek(0, SeekOrigin.Begin);
    xDoc.Save(inStream);
    await inStream.FlushAsync();
}

それは正確にはあなたのコードではありません (Single を呼び出してコンパイルすることができませんでした) が、パターンを見ることができます。つまり、Seekの呼び出しです。

于 2012-11-30T07:47:10.177 に答える