.NET中最简单的键/值对文件解析

时间:2008-11-12 18:29:41

标签: c# .net xml

我的项目需要一个文件,我将存储应该能够被用户读取和修改的键/值对数据。我希望程序只是期望键存在,我想尽快从文件中解析它们。

我可以将它们存储在XML中,但XML是复杂的方式,它需要遍历节点和子节点等等,我想要的只是一些获取文件并生成键值对的类。我希望尽可能少的错误处理,并希望尽可能少的代码完成。

我可以自己编写一个类似的类,但我更愿意了解它在框架中的表现并不是两次发明轮子。 .NET(3.5)中是否有一些内置的魔术类能够这样做?

MagicClass kv = new MagicClass("Settings.ini"); // It doesn't neccesarily have to be an INI file, it can be any simple key/value pair format.
string Value1 = kv.get("Key1");
...

5 个答案:

答案 0 :(得分:7)

如果您正在寻找快速简便的功能,并且不想使用.Net app \ user配置设置文件或担心有时会发生的序列化问题。

以下静态函数可以加载格式为" KEY = VALUE"的文件。

    public static Dictionary<String, String> LoadConfig(string settingfile)
    {
        var dic = new Dictionary<String, String>();

        if (File.Exists(settingfile))
        {
            var settingdata = File.ReadAllLines(settingfile);
            for (var i = 0; i < settingdata.Length; i++)
            {
                var setting = settingdata[i];
                var sidx = setting.IndexOf("=");
                if (sidx >= 0)
                {
                    var skey = setting.Substring(0, sidx);
                    var svalue = setting.Substring(sidx+1);
                    if (!dic.ContainsKey(skey))
                    {
                        dic.Add(skey, svalue);
                    }
                }
            }
        }

        return dic;
    }

注意:我使用的是字典,因此密钥必须是唯一的,这通常是设置的情况。

用法:

    var settingfile = AssemblyDirectory + "\\mycustom.setting";
    var settingdata = LoadConfig(settingfile);
    if (settingdata.ContainsKey("lastrundate"))
    {
        DateTime lout;
        String svalue;
        if (settingdata.TryGetValue("lastrundate", out svalue))
        {
            DateTime.TryParse(svalue, out lout);
            lastrun = lout;
        }
    }

答案 1 :(得分:6)

我不知道任何用于解析ini文件的内置类。我需要时使用nini。它是根据MIT / X11许可证授权的,因此没有任何问题可以包含在封闭源程序中。

非常适合使用。因此,如果您有这样格式化的Settings.ini文件:

[Configuration]
Name = Jb Evain
Phone = +330101010101

使用它就像下面这样简单:

var source = new IniConfigSource ("Settings.ini");
var config = source.Configs ["Configuration"];

string name = config.Get ("Name");
string phone = config.Get ("Phone");

答案 2 :(得分:6)

使用KeyValuePair类为您键入和值,然后使用ListXMLSerializer序列化为磁盘。

这是我觉得最简单的方法。您不必担心遍历节点。调用Deserialize函数将为您完成。用户可以根据需要编辑文件中的值。

答案 3 :(得分:2)

如果您希望用户能够阅读和修改文件,我建议使用逗号分隔的一对,每行一个

key1,value1
key2,value2
...

解析很简单:读取文件,以换行符或逗号分割,然后成对获取元素

答案 4 :(得分:0)

以这种方式格式化文件:

key1=value1
key2=value2

将整个文件读入一个字符串(有一个简单的便捷函数,可以在File或string类中执行),并调用string.Split('=')。确保在遍历列表时对每个键和值调用string.Trim()并将每个对弹出一个哈希表或字典。