【问题标题】:Saving xDocument after delete a element in Windows Store Application (Windows 8 Metro)在 Windows 应用商店应用程序(Windows 8 Metro)中删除元素后保存 xDocument
【发布时间】:2012-11-29 15:44:10
【问题描述】:

首先我想再次提及我的平台是 windows store 应用程序(因为有些用户认为我在谈论桌面环境并将我的问题作为重复的主题关闭)。我有一个 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>

请给我建议并感谢您的帮助。

更新:

Jim O'Neil 建议保存的文档是这样的

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

【问题讨论】:

    标签: c# xml windows-8 linq-to-xml windows-store-apps


    【解决方案1】:

    您已打开文件进行读/写访问,当您加载 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

    【讨论】:

    • 我不明白?我看到您更新了 XML 以匹配您寻找“Word”的代码,但这不是“重要”部分。现在可以调用 Seek 了吗?
    猜你喜欢
    • 2012-12-07
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多