1

目前正在开发一个 wp7 应用程序,它非常基础。用户有一个计数器,如果 XML 文件中存在当天的日期元素,则更新计数,如果没有,则为该天创建一个新的日期元素,并将计数作为值。

我的问题是,如果创建一个新的 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();
        }

    }

如果您需要更多信息,请告诉我,这是我在过去几年潜伏后第一次在这里发帖。

干杯

乔恩

4

2 回答 2

1

好的,我已经解决了。这个查询:

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

只有当第一个 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 的数据类型处理,而不是将所有内容显式转换为字符串。

于 2012-04-21T08:01:41.500 回答
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;
于 2012-04-21T08:09:59.413 回答