如何更新和添加带有属性的条目到xml文件,按日期排序?

时间:2015-08-31 11:53:57

标签: c# xml

我想将我记录的按键记录及其ID和每天的计数存储到xml文件中。键击是temporaray保存在Hashtable中。我想每20秒将收集到的数据从哈希表移动到xml文件。程序应该创建一个带有属性Keyid的新条目和带有当前日期的条目元素下的收集金额。如果密钥已经存在,则程序应通过将新计数添加到旧密钥来更新此密钥的计数。这是我的示例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#

1 个答案:

答案 0 :(得分:0)

您可以按照以下方式执行此操作:

  1. 使用XDocument加载XML文件。
  2. 将您的数据转换为字典词典。
  3. 将新数据合并到字典词典中。
  4. 将字典字典转换回XML。
  5. 以下代码演示。它期望输入一个名为&#34; D:\ TEST \ INPUT.XML&#34;包含您问题中的XML代码。

    如果创建一个名为&#34; D:\ TEST \ OUTPUT.XML&#34;的文件作为输出。包含合并的数据。编辑文件名以适应。

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

    鉴于此输入:

    <?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;
                }
            }
        }
    }