У меня есть метод, который удаляет синхронизации раза старше 10 сек старая и затем добавляет новый один при выстреле:LINQ к XML-файл не сохраняется правильно
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);
}
}
Теперь, при использовании 1-й метод несколько раз и экономии я получаю поврежденный 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>"
Почему файл получать перепутались?
Файл, который вы сохраняете, не усекается, прежде чем вы пишете на него, поэтому вы просто перезаписываете первую часть, а остальное - то, что было раньше. Вам нужно будет показать нам, что на самом деле делает 'storageFile.OpenStreamForWriteAsync()'. –
@Charles Mager Как обрезать файл? storageFile - из Windows. Хранилище; Вот как я инициализирую: StorageFile storageFile = ожидание storageFolder.GetFileAsync ("myxmlfile.xml"); –