如何更新和添加带有属性的条目到XML文件(按日期排序)

本文关键字:XML 文件 日期 排序 更新 何更新 添加 属性 | 更新日期: 2023-09-27 18:10:27

我想将记录的按键及其id和每天的计数存储到一个xml文件中。击键被临时保存在哈希表中。我希望每隔20秒将收集到的数据从散列表移动到xml文件中。程序应该创建一个带有属性Keyid的新条目,并在条目元素下收集当前日期的金额。如果一个Key已经存在,程序应该通过将新计数添加到旧计数中来更新该Key的计数。下面是我的示例XML文件:

<?xml version="1.0" encoding="utf-8" ?>
<entrys>
  <entry date="2015_08_31">
    <key id ="4">78</key>
    <key id ="99">4</key>
    <key id ="210">7</key>
  </entry>
  <entry date="2015_08_30">
    <key id ="4">8</key>
    <key id ="9">6</key>
    <key id ="210">8</key>
  </entry>
</entrys>

c#

如何更新和添加带有属性的条目到XML文件(按日期排序)

您可以这样做:

  1. 使用XDocument加载XML文件
  2. 将您的数据转换为字典的字典
  3. 合并新数据到字典的字典
  4. 将字典的字典转换回XML。

以下代码演示。它期望输入一个名为"D:'TEST' input .XML"的文件,其中包含您的问题中的XML代码。

If创建一个名为"D:'TEST' output . xml"的文件作为输出,其中包含合并的数据。编辑文件名以适应。

希望你可以在调试器下运行这段代码,以了解它是如何工作的。

给定这个输入:

<?xml version="1.0" encoding="utf-8" ?>
<entrys>
  <entry date="2015_08_31">
    <key id ="4">78</key>
    <key id ="99">4</key>
    <key id ="210">7</key>
  </entry>
  <entry date="2015_08_30">
    <key id ="4">8</key>
    <key id ="9">6</key>
    <key id ="210">8</key>
  </entry>
</entrys>

运行代码得到以下输出:

<?xml version="1.0" encoding="utf-8"?>
<entrys>
  <entry date="2015_08_31">
    <key id="4">78</key>
    <key id="99">14</key>
    <key id="210">7</key>
    <key id="300">20</key>
  </entry>
  <entry date="2015_08_30">
    <key id="4">8</key>
    <key id="9">6</key>
    <key id="210">8</key>
  </entry>
</entrys>

代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace Demo
{
    internal class Program
    {
        [STAThread]
        private static void Main()
        {
            var doc = XDocument.Load("D:''TEST''INPUT.XML"); // Assume you have the XML file stored here.
            // Convert existing entries to a dictionary of dictionaries: 
            // So dict[date][key] == count
            var entries = doc.Elements("entrys").Elements("entry");
            var existing = entries.ToDictionary
            (
                item => item.Attribute("date").Value, 
                item => item.Descendants("key").ToDictionary
                (
                    key => (int)key.Attribute("id"),
                    key => (int)key
                )
            );
            // SAMPLE DATA: Add new items for specific date.
            string date = "2015_08_31";
            var newData = new Dictionary<int, int>();
            newData[99]  = 10;
            newData[300] = 20;
            addEntriesForDate(date, existing, newData);
            // Store back to XML.
            var xd = new XDocument(new XDeclaration("1.0", "UTF-8", ""),
                new XElement("entrys", existing.Select(kvp => 
                    new XElement("entry", new XAttribute("date", kvp.Key), kvp.Value.Select(key =>
                        new XElement("key", new XAttribute("id", key.Key), key.Value 
             ))))));
            xd.Save("D:''TEST''OUTPUT.XML");
        }
        private static void addEntriesForDate(string date, Dictionary<string, Dictionary<int, int>> existing, Dictionary<int, int> newData)
        {
            if (!existing.ContainsKey(date))
                existing[date] = new Dictionary<int, int>();
            var data = existing[date];
            foreach (var entry in newData)
            {
                if (data.ContainsKey(entry.Key))
                    data[entry.Key] += entry.Value;
                else
                    data[entry.Key] = entry.Value;
            }
        }
    }
}