2013-03-19 87 views
0

我有這個XMLFILE(tasks.xml):更新數據(LINQ到XML)產生wrongclosing標籤

<?xml version="1.0" encoding="utf-8"?> 
<Tasks> 
    <Task> 
    <Id>dc77b03f-468c-4709-b8dc-4d9741c984dd</Id> 
    <Name>buy paper</Name> 
    <Category>inbox</Category> 
    <DueDate></DueDate> 
    <Project></Project> 
    <Context></Context> 
    <Note></Note> 
    <Created>03/16/2013 15:33:29</Created> 
    <Finished></Finished> 
    </Task> 
</Tasks> 

當我更新元素類似這樣的一切工作正常:

try 
{ 
    var item = (CheckBox)sender; 
    dynamic itemDC = item.DataContext; 

    var folder = ApplicationData.Current.LocalFolder; 
    var file = await folder.GetFileAsync("tasks.xml"); 
    var readStream = await FileIO.ReadTextAsync(file); 
    using (var writeStream = await file.OpenStreamForWriteAsync()) 
    { 
     XElement xElem = XElement.Parse(readStream); 

     IEnumerable<XElement> singleTask = from task in xElem.Elements("Task") 
              where (string)task.Element("Id") == itemDC.Id 
              select task; 

     foreach (XElement task in singleTask) 
     { 
      task.SetElementValue("Finished", DateTime.Now.ToString("MM") + "/" + DateTime.Now.ToString("dd") + "/" + DateTime.Now.ToString("yyyy HH:mm:ss")); 
     } 

     xElem.Save(writeStream); 
    } 
} 
catch (Exception ex) 
{ 
    new MessageDialog(ex.Message).ShowAsync(); 
} 

但如果我想再次編輯<Finnished>元素並將值設置爲「」,它將在我的XML文件中生成兩個錯誤的結束標記。

再次編輯代碼:

try 
{ 
    var item = (CheckBox)sender; 
    dynamic itemDC = item.DataContext; 

    var folder = ApplicationData.Current.LocalFolder; 
    var file = await folder.GetFileAsync("tasks.xml"); 
    var readStream = await FileIO.ReadTextAsync(file); 
    using (var writeStream = await file.OpenStreamForWriteAsync()) 
    { 
     XElement xElem = XElement.Parse(readStream); 

     IEnumerable<XElement> singleTask = from task in xElem.Elements("Task") 
              where (string)task.Element("Id") == itemDC.Id 
              select task; 

     foreach (XElement task in singleTask) 
     { 
      task.SetElementValue("Finished", ""); 
     } 

     xElem.Save(writeStream); 
    } 
} 
catch (Exception ex) 
{ 
    new MessageDialog(ex.Message).ShowAsync(); 
} 

錯誤生成的XML後編輯<Finished>爲「」:

<?xml version="1.0" encoding="utf-8"?> 
<Tasks> 
    <Task> 
    <Id>dc77b03f-468c-4709-b8dc-4d9741c984dd</Id> 
    <Name>dnešní úkol</Name> 
    <Category>inbox</Category> 
    <DueDate></DueDate> 
    <Project></Project> 
    <Context></Context> 
    <Note></Note> 
    <Created>03/16/2013 15:33:29</Created> 
    <Finished></Finished> 
    </Task> 
</Tasks> </Task> 
</Tasks> 

如果我用繩子一樣大小日期字符串重新編輯,一切工作正常,但明確「」值做那個錯誤。

我花了很多時間弄清楚,但現在我不知道如何解決這個問題。

我在做什麼錯了?

+0

這裏有一個你做錯了什麼。 'ex.Message'對故障排除沒有幫助。改爲使用'ex.ToString()'。 – 2013-03-19 01:21:08

回答

1

您的問題與Linq to XML無關。這只是流如何工作。在第一種情況下,您將獲得更長的文件,因此以前的所有內容都將被覆蓋。在第二種情況下,新文件更短,因此其餘內容保持不變。

您應該覆蓋,當你保存修改後的XML現有的文件:

var folder = ApplicationData.Current.LocalFolder; 
var file = await folder.GetFileAsync("tasks.xml"); 
var readStream = await FileIO.ReadTextAsync(file); 
XElement xElem = XElement.Parse(readStream); 

IEnumerable<XElement> singleTask = from task in xElem.Elements("Task") 
            where (string)task.Element("Id") == itemDC.Id 
            select task; 
foreach (XElement task in singleTask) 
{ 
    task.SetElementValue("Finished", ""); 
} 

file = await folder.CreateFileAsync("tasks.xml", CreationCollisionOption.ReplaceExisting); 
using (var writeStream = await file.OpenStreamForWriteAsync()) 
{ 
    xElem.Save(writeStream); 
} 

另外,保存DateTime時到XML你真的應該XmlConvert將其序列:

task.SetElementValue("Finished", XmlConvert.ToString(DateTime.Now)); 
+0

太好了,它可以工作,謝謝。 – Earlgray 2013-03-19 12:35:05