none
Metro 使用linq to xml删除出现的问题 RRS feed

  • 问题

  • 你好,

        我在使用metro 中的 xdocument 对象删除xml节点后,保存出现问题。  删除节点成功,但是保存后xml格式错误。

    <USER>
        <ID>81</ID>
        <FULLNAME>朱素芳</FULLNAME>
        <USRNAM>ZHUHF</USRNAM>
        <MONITORPASS>LIMS</MONITORPASS>
        <DEPTLIST>环境研究室</DEPTLIST>
      </USER>

    </USERS>    <ID>81</ID>
        <FULLNAME>朱素芳</FULLNAME>
        <USRNAM>ZHUHF</USRNAM>
        <MONITORPASS>LIMS</MONITORPASS>
        <DEPTLIST>环境研究室</DEPTLIST>
      </USER>
    </USERS>

    在跟节点结束后又重复出现了部分最后一个子节点。

    请问这是什么情况?

     (from model in xdoc.Descendants(modelName)
                     where model.Element("ID").Value == id.ToString()
                     select model).Remove();
                    using (IRandomAccessStream s = await xml.OpenAsync(FileAccessMode.ReadWrite))
                    {
                        Stream sm = s.AsStreamForWrite();
                        xdoc.Save(sm, SaveOptions.None);
                    }
                    await Dispose();
                    return true;

    2012年8月24日 4:06

答案

  • 问题在于你读的和存的是同一个文件,我猜测你删除的是ID="80" 或者在这个81 之前的一个USER元素对吧,然后通过流再往这个文件中写回,因为现在比之前少了内容,所以无法覆盖之前全部的内容,所以之前比现在多出来的部分还保留在文件中,形成里你现在的现象。

    这样 你在保存之后将流的大小缩小到你现在的流所在位置,既可以将原先保留的内容清除掉了:

                using (IRandomAccessStream s = await xml.OpenAsync(FileAccessMode.ReadWrite))
                {
                    Stream sm = s.AsStreamForWrite();
                    xdoc.Save(sm, SaveOptions.None);
                    sm.SetLength(sm.Position);
                }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年8月27日 7:37
    版主