2012-04-21 38 views
1

目前正在使用wp7應用程序,它非常基本。用戶有一個計數器,並且如果在XML文件中存在當天的日期元素,則更新計數,如果沒有爲該日創建新的日期元素並且將計數作爲值。Linq查詢更新XML文件,如果元素存在不工作

我的priblem是,一切都工作正常,如果一個新的XML文件被創建,當前的日期元素更新沒有問題,但如果我測試第二天,一個新的元素被創建,但是當我想更新計數,新的日期元素被添加。因爲所有的代碼都在新文件上工作,所以我不明白這一點,但如果文件已經過時,那麼它並不是出於某種原因。

XML代碼

<?xml version="1.0" encoding="utf-8"?> 
<Countlog> 
<date Count="9">4/21/2012</date> 
<date Count="4">4/21/2012</date> 
<date Count="18">4/21/2012</date> 
</Countlog> 

C#

private void save_btn_Click(object sender, RoutedEventArgs e) 
    { 
     String _count = Count_tb.Text; 
     String s_todaysdate = todaysdate.Date.ToShortDateString(); 

     IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("Countlog.xml", FileMode.Open, myIsolatedStorage); 
     StreamReader reader = new StreamReader(isoStream); 
     XDocument _xml = XDocument.Load(reader); 
     isoStream.Close(); 

     var query = from r in _xml.Descendants("Countlog") 
        where r.Element("date").Value == (DateTime.Now.ToShortDateString()) 
        select r.Element("date"); 


     if (!query.Any()) 
     { 
      XElement Addnewdate = new XElement("date", s_todaysdate, new XAttribute("Count", _count)); 
      _xml.Root.Add(Addnewdate); 
      MessageBox.Show("no matching date"); 
     } 
     else 
     { 
      foreach (XElement _date in query) 
      { 
       _date.Attribute("Count").Value = _count.ToString(); 
       MessageBox.Show("Updating date"); 

      } 
     } 

     IsolatedStorageFileStream isoStreamsave = new IsolatedStorageFileStream("Countlog.xml", FileMode.Truncate, myIsolatedStorage); 

     _xml.Save(isoStreamsave); 
     isoStreamsave.Close(); 
    } 





    private void Pivot_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (pivotholder.SelectedIndex == 1) 
     { 
      IsolatedStorageFileStream isoFileStream2 = myIsolatedStorage.OpenFile("Countlog.xml", FileMode.Open); 
      StreamReader reader = new StreamReader(isoFileStream2); 
      XML_result.Text = reader.ReadToEnd(); 
      reader.Close(); 
     } 

    } 

請讓我知道如果你需要更多的信息,這是潛伏在過去幾年後我第一次在這裏發帖。

乾杯

喬恩

+0

即使示例XML文件重複日期......是故意的嗎? – 2012-04-21 07:37:24

+0

是的,我複製了手機上顯示的內容。我只想每天都有一個日期元素,並且如果它已經存在就更新值。 – 2012-04-21 07:57:10

回答

1

好啦,我已經工作了。這個查詢:如果第一date元素具有正確的價值

var query = from r in _xml.Descendants("Countlog") 
      where r.Element("date").Value == (DateTime.Now.ToShortDateString()) 
      select r.Element("date"); 

將只匹配。您正在迭代所有Countlog元素(其中只有一個元素),並查找第一個date元素(因爲這就是Element(...)所做的)。

你可以改變這一點簡單地使用:

var query = _xml.Root.Elements("date") 
        .Where(x => x.Value == (DateTime.Now.ToShortDateString()) 

不過,我會建議另一種形式入手:

var date = DateTime.Today; 
var query = _xml.Root.Elements("date") 
       .Where(x => (DateTime) x.Value == date); 

然後添加新的元素:

XElement element = new XElement("date", 
         new XAttribute("count", count), 
         date); 

或更新一個:

element.Attribute("count").SetValue(count); 

這使用LINQ to XML的數據類型處理,而不是顯式地將所有內容都轉換爲字符串。

+0

多數民衆贊成,謝謝你的時間和幫助!現在似乎都在工作。我可以看到,我只是指定了「元素」而不是「元素」,正如你所說的,它只會查找最上面的元素。這將解釋它在第一天的工作方式,但在它仍然在看最高點日期元素之後的任何一天。 – 2012-04-21 08:32:10

0

1)你目前的形式搜索就是在那一刻

where r.Element("date").Value == (DateTime.Now.ToShortDateString()) 

另外一個真正的約會日期,要查詢,我相信查詢,一些其他的日期您在s_todaysdate變量中存儲的值。

2)正如Jon Skeet所指出的,你認爲只有一個<date>元素。 通過_xml.Root.Elements("date")開始您的查詢。

因此,最終的查詢需要進行修改,以:

var query = from date in _xml.Root.Elements("date") 
      where date.Value == s_todaysdate 
      select date; 
+0

感謝您的回覆。 – 2012-04-23 09:46:31