Linq 查询,用于在元素不存在时更新 XML 文件不起作用
本文关键字:更新 XML 文件 不起作用 不存在 元素 查询 用于 Linq | 更新日期: 2023-09-27 18:31:47
目前正在开发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();
}
}
如果您需要更多信息,请告诉我,这是我在过去几年潜伏后第一次在这里发帖。
干杯
乔恩
好的,我已经解决了。此查询:
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 到 XML 的数据类型处理,而不是将所有内容显式转换为字符串。
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;