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 回答