LINQ to XML文件无法正确保存

时间:2015-04-01 15:33:33

标签: c# xml linq linq-to-xml

我有一种方法可以删除早于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>

那么这里发生了什么?调试显示试图保存的字符串存储在XDocucument对象中是正确的:

"<!--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>"

为什么文件搞砸了?

1 个答案:

答案 0 :(得分:3)

我对WinRT不是很熟悉,但是从我认为您需要使用的文档开始:

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

GetFileAsync将按原样打开现有文件 - 这将允许您阅读其内容。由于您所写的内容小于现有内容,因此不会触及剩余的现有内容。

如果你想坚持使用GetFileAsync,那么在写作之前设置fileStream.Length = 0就可以解决你所看到的问题。