0

我有一个我想定义的 app.config 部分,作为一个简单的部分IDictionary<string, IDictionary<string, string>>,它在 app.config 文件中看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="ServiceInstances" type="MyProject.Configuration, MyProject"/>
    </configSections>
    <ServiceInstances>
        <ServiceInstance name="service1">
            <kvp key="key1" value="value1"/>
            <kvp key="key2" value="value2"/>
        </ServiceInstance>
        <ServiceInstance name="service2">
            <kvp key="key3" value="value3"/>
            <kvp key="key2" value="value2"/>
        </ServiceInstance>
    </ServiceInstances>
</configuration>

我看到的所有教程似乎都很深入,我只是在寻找一种快速而肮脏的方法来做到这一点:

IDictionary<string, string> foo = Configuration.GetDictionary("service1");
IDictionary<string, string> bar = Configuration.GetDictionary("service2");

看起来这实际上应该是几行代码,但教程似乎不必要地使其复杂化。有没有一个快速的答案,如果是这样,有人可以告诉我它应该是什么样子吗?

4

2 回答 2

2

首先,您将 XML 文件解析为Dictionary<string, Dictionary<string, string>>. 看起来像这样:

public Dictionary<string, Dictionary<string, string>> getDictionary()
{
    XmlDocument doc = new XmlDocument();
    doc.Load(@"path/to/file.xml");

    Dictionary<string, Dictionary<string, string>> outer = new Dictionary<string, Dictionary<string, string>>();
    Dictionary<string, string> inner;

    //cycle through outer nodes
    foreach (XmlNode service in doc.SelectNodes("/configuration/ServiceInstances/ServiceInstance"))
    {
        inner = new Dictionary<string, string>();
        //cycle through inner nodes
        foreach (XmlNode kvp in service.SelectNodes("kvp"))
        {
            inner.Add(kvp.Attributes["key"].Value, kvp.Attributes["value"].Value);
        }
        outer.Add(service.Attributes["name"].Value, inner);
    }

    return outer;
}

然后你可以像这样调用你的字典:

var foo = getDictionary();
Dictionary<string,string> bar = foo["service1"];
于 2012-08-06T13:44:56.003 回答
1

您可以使用配置部分设计器来完成这项肮脏的工作:

http://csd.codeplex.com/

它有视觉工作室设计器支持,生成示例配置,只是到目前为止有一个问题 - 如果 VS2012 需要安装 VS2010,但我认为这将很快得到解决。

于 2012-08-06T13:59:27.213 回答