LINQ to XML 文件未正确保存

LINQ to XML file not saving correctly

我有一种方法可以删除早于 10 秒的同步时间,然后在触发时添加一个新同步时间:

    public void addSyncTime()
    {
        //delete archived sync times
        XMLDocObject.Descendants("LastSync")
           .Where(e => Convert.ToDateTime(e.Element("Time").Value) < DateTime.Now.AddSeconds(-10))
           .Where(e => e.Element("id").Value != "1")
           .Remove();
        string t1 = XMLDocObject.ToString();
        //get the last primary key added
        var lastPrimaryKey = (from i in XMLDocObject.Element("DataLoadTimes").Elements("LastSync").Elements("id")
                              select i).LastOrDefault().Value;
        //increment it once
        int newPrimaryKey = Convert.ToInt32(lastPrimaryKey) + 1;
        //create element to insert
        var newElement = new XElement("LastSync",
               new XElement("id", newPrimaryKey),
               new XElement("Time", DateTime.Now.ToString()));
        //add to XML doc object
        XMLDocObject.Element("DataLoadTimes").Add(newElement);
        string t2 = XMLDocObject.ToString();
    }

以上字符串用于断点测试

以上代码创建 XML 如下:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--QTabs Data Storage-->
<DataLoadTimes>
  <LastSync>
    <id>1</id>
    <Time>4/1/2015 10:29:13 AM</Time>
  </LastSync>
  <LastSync>
    <id>2</id>
    <Time>4/1/2015 10:29:14 AM</Time>
  </LastSync>
  <LastSync>
    <id>3</id>
    <Time>4/1/2015 10:29:15 AM</Time>
  </LastSync>
</DataLoadTimes>

下面是在触发上述内容后保存到 XML 的保存方法:

    public async void saveToXmlFile()
    {
        //storageFile = await storageFolder.GetFileAsync(Settings.xmlFile);
        using (Stream fileStream = await storageFile.OpenStreamForWriteAsync())
        {
            XMLDocObject.Save(fileStream);
        }
    }

现在,当使用第一种方法几次并保存时,我得到一个损坏的 XML 文件:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--QTabs Data Storage-->
<DataLoadTimes>
  <LastSync>
    <id>1</id>
    <Time>4/1/2015 10:23:53 AM</Time>
  </LastSync>
  <LastSync>
    <id>2</id>
    <Time>4/1/2015 10:27:04 AM</Time>
  </LastSync>
</DataLoadTimes>  <id>3</id>
    <Time>4/1/2015 10:26:43 AM</Time>
  </LastSync>
  <LastSync>
    <id>4</id>
    <Time>4/1/2015 10:26:44 AM</Time>
  </LastSync>
</DataLoadTimes>

注意这一行:</DataLoadTimes> <id>3</id>

这是怎么回事?调试显示XDocument对象中试图保存的字符串是正确的:

"<!--QTabs Data Storage-->\r\n<DataLoadTimes>\r\n  <LastSync>\r\n    <id>1</id>\r\n    <Time>4/1/2015 10:23:53 AM</Time>\r\n  </LastSync>\r\n  <LastSync>\r\n    <id>2</id>\r\n    <Time>4/1/2015 10:27:04 AM</Time>\r\n  </LastSync>\r\n</DataLoadTimes>"

为什么文件变乱了?

我对 WinRT 不太熟悉,但从文档中我认为您需要使用:

await storageFolder.CreateFileAsync("myxmlfile.xml", CreationCollisionOption.ReplaceExisting);

GetFileAsync 将按原样打开现有文件 - 这将允许您阅读它的内容。由于你写的内容比已有的内容小,所以剩下的已有内容没有动。

如果您想坚持使用 GetFileAsync,那么在写入之前设置 fileStream.Length = 0 应该可以解决您遇到的问题。