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
应该可以解决您遇到的问题。
我有一种方法可以删除早于 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
应该可以解决您遇到的问题。