1

現在、wp7 アプリに取り組んでいますが、これは非常に基本的なものです。ユーザーにはカウンターがあり、XML ファイルに現在の日付の日付要素が存在する場合はカウントが更新されます。そうでない場合は、その日付の新しい日付要素が作成され、カウントが値として使用されます。

私の問題は、新しい XML ファイルが作成され、現在の日付要素が問題なく更新されている場合、すべて正常に機能していますが、翌日テストすると新しい要素が作成されますが、カウントを更新したい場合、新しい日付要素が追加されました。すべてのコードが新しいファイルで機能するため、これはわかりませんが、ファイルが1日古い場合は、何らかの理由でそうではありません。

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要素が正しい値を持っている場合にのみ一致します。すべての要素(そのうちの1つだけ)を反復処理し、最初の要素Countlogを探します(それが何をするのか)。dateElement(...)

これを変更して、次のように簡単に使用できます。

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);

または1つを更新するには:

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

これは、すべてを明示的に文字列に変換する代わりに、LINQtoXMLのデータ型処理を使用します。

于 2012-04-21T08:01:41.500 に答える
0

1)現在の形式のクエリは、その時点で実際の日付である日付を検索します

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

一方、クエリしたいのは、s_todaysdate変数に保存する他の日付だと思います。

2) Jon Skeet が既に指摘したように、<date>要素は 1 つしかないと仮定します。クエリを最初からやり直してください_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 に答える