关于C#:在自定义配置节app.config中定义重复的键值

Defining duplicate key values in custom config section app.config

我有一个自定义配置部分,即registercompanies。但是两个条目的键名具有相同的值。当我试图读取配置部分时,我得到的配置错误异常说明已经添加了键元素xxx。有人能告诉我如何在自定义配置中添加重复的键吗?下面是我要添加到app.config中的config部分。

1
2
3
4
5
6
<RegisterCompanies>
    <Companies>
      <Company name="Tata Motors" code="Tata"/>
      <Company name="Tata Motors" code="Honda"/>
    </Companies>
  </RegisterCompanies>

我认为你应该这样做:

1
2
3
4
5
6
7
8
<RegisterCompanies>
    <Companies>
      <Company name="Tata Motors">
          <Code name="Tata"/>
          <Code name="Honda"/>
      </Company>
    </Companies>
</RegisterCompanies>

如果您的配置结构是这样的

1
2
3
4
5
6
7
8
9
10
<RegisterCompanies>
    <Companies>
      <Company name="Tata Motors">
        <Codes>
          <Code name="Tata" />
          <Code name="Honda" />
        </Codes>
      </Company>
    </Companies>
  </RegisterCompanies>

然后您需要下面的部分处理程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class CompaniesConfigurationHandler : IConfigurationSectionHandler
{
    public object Create(object parent, object configContext, XmlNode section)
    {
        var config = new CompaniesConfiguration();
        XmlNode xCompanies = section.SelectSingleNode("Companies");
        if (xCompanies == null)
            throw new ConfigurationErrorsException("Companies node not found");
        config.Companies = CreateCompanies(xCompanies);
        return config;
    }

    private static CompanyConfiguration[] CreateCompanies(XmlNode xCompanies)
    {
        var nodes = xCompanies.SelectNodes("Company");
        return nodes == null ?
                   new CompanyConfiguration[0]
                   : nodes.Cast<XmlNode>().Select(ReadCompany).ToArray();
    }

    private static CompanyConfiguration ReadCompany(XmlNode xCompany)
    {
        var company = new CompanyConfiguration();
        if (!((XmlElement) xCompany).HasAttribute("name"))
            throw new ConfigurationErrorsException("Company node must have name attribute", xCompany);
        company.Name = ((XmlElement) xCompany).GetAttribute("name");
        var codes = (XmlElement)xCompany.SelectSingleNode("Codes");
        company.Codes = ReadCodes(codes);
        return company;
    }

    private static string[] ReadCodes(XmlNode xElement)
    {
        XmlNodeList xItems = xElement.SelectNodes("Code");
        return xItems == null ?
                                  new string[0]
                   : xItems
                         .Cast<XmlElement>()
                         .Where(xItem => xItem.HasAttribute("name"))
                         .Select(xItem => xItem.GetAttribute("name"))
                         .ToArray();
    }
}

public class CompanyConfiguration
{
    public string Name { get; set; }
    public string[] Codes { get; set; }
}

public class CompaniesConfiguration
{
    public CompanyConfiguration[] Companies { get; set; }
}

轻松的生活。


一个讨厌的方法是交换XML中的密钥和代码

1
2
3
4
5
6
<RegisterCompanies>
    <Companies>
      <Company code="Tata Motors" name="Tata"/>
      <Company code="Tata Motors" name="Honda"/>
    </Companies>
  </RegisterCompanies>

然后重新分析得到的集合以修复问题,但如前所述,这是一个非常讨厌的方法。

因为您定义了自己的配置块,所以应该能够提供到不同集合对象的映射(一个对象接受同一个键的几种方法)。我想我有类似的东西,它为ASP.NET应用程序注册了部分文件解析器/渲染器。我会尽快找到的。

这里可以找到初始细节和一个相当完整的样本

当做


我希望更改数据结构,这样每个公司都可以有模式"代码"条目

1
2
3
4
5
6
7
8
9
   <RegisterCompanies>
    <Companies>
      <Company name="Tata Motors"/>
      <Codes>
        <Code name="Tata" />
        <Code name="Honda" />
      </Codes>
    </Companies>
  </RegisterCompanies>