如何更新和添加带有属性的条目到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#
您可以这样做:
- 使用XDocument加载XML文件
- 将您的数据转换为字典的字典
- 合并新数据到字典的字典
- 将字典的字典转换回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;
}
}
}
}