【问题标题】:Defining duplicate key values in custom config section app.config在自定义配置部分 app.config 中定义重复的键值
【发布时间】:2011-12-10 16:13:42
【问题描述】:

我有一个自定义配置部分,即 RegisterCompanies。但是两个条目的键名具有相同的值。当我尝试读取配置部分时,我收到 ConfigurationerrorException 说 Key element xxx 已添加。谁能告诉我如何添加自定义配置中的重复键。 以下是我要添加到我的 app.config 的配置部分 ..

<RegisterCompanies>
    <Companies>
      <Company name="Tata Motors" code="Tata"/>
      <Company name="Tata Motors" code="Honda"/>
    </Companies>
  </RegisterCompanies>

【问题讨论】:

    标签: c# app-config


    【解决方案1】:

    我认为你应该这样做:

    <RegisterCompanies>
        <Companies>
          <Company name="Tata Motors">
              <Code name="Tata"/>
              <Code name="Honda"/>
          </Company>
        </Companies>
    </RegisterCompanies>
    

    【讨论】:

      【解决方案2】:

      我更喜欢更改数据结构,因此每个公司都可以像这样有模式“代码”条目

         <RegisterCompanies>
          <Companies>
            <Company name="Tata Motors"/>
            <Codes>
              <Code name="Tata" />
              <Code name="Honda" />
            </Codes>
          </Companies>
        </RegisterCompanies>
      

      【讨论】:

        【解决方案3】:

        一种讨厌的方式可能是在您的 xml 中交换密钥和代码

        <RegisterCompanies>
            <Companies>
              <Company code="Tata Motors" name="Tata"/>
              <Company code="Tata Motors" name="Honda"/>
            </Companies>
          </RegisterCompanies>
        

        然后重新解析生成的集合以修复问题,但如前所述,这是一种非常糟糕的方式。

        由于您正在定义自己的配置块,您应该能够提供到不同集合对象的映射(一个接受相同键的多种方式)。我想我有类似的东西,它为 ASP.NET 应用程序注册节文件解析器/渲染器。如果我能尽快找到它,我会看看。

        初步细节和相当完整的样本可以在here找到

        问候

        【讨论】:

          【解决方案4】:

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

          <RegisterCompanies>
              <Companies>
                <Company name="Tata Motors">
                  <Codes>
                    <Code name="Tata" />
                    <Code name="Honda" />
                  </Codes>
                </Company>
              </Companies>
            </RegisterCompanies>
          

          那么您需要以下部分处理程序

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

          简单易懂。

          【讨论】:

            猜你喜欢
            • 2011-10-02
            • 2012-10-04
            • 1970-01-01
            • 2015-07-05
            • 2011-05-25
            • 2011-11-04
            • 2010-11-21
            • 2012-12-12
            相关资源
            最近更新 更多