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