我试图实现从配置文件中读取节的通用方法.配置文件可能包含"标准"部分或"自定义"部分,如下所示.
我尝试的方法如下:
private string ReadAllSections() { StringBuilder configSettings = new StringBuilder(); Configuration configFile = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); foreach (ConfigurationSection section in configFile.Sections) { configSettings.Append(section.SectionInformation.Name); configSettings.Append(Environment.NewLine); if (section.GetType() == typeof(DefaultSection)) { NameValueCollection sectionSettings = ConfigurationManager.GetSection(section.SectionInformation.Name) as NameValueCollection; if (sectionSettings != null) { foreach (string key in sectionSettings) { configSettings.Append(key); configSettings.Append(" : "); configSettings.Append(sectionSettings[key]); configSettings.Append(Environment.NewLine); } } } configSettings.Append(Environment.NewLine); } return configSettings.ToString(); }
假设所有自定义部分都只有KEY-VALUE
这样的实现是否可行?如果是的话,是否有比这更"干净"且更优雅的解决方案?
上面的方法还会读取像mscorlib,system.diagnostics这样的"不可见"部分.这是可以避免的吗?
System.Data.Dataset返回无法强制转换为NameValueCollection的数据集.怎么办呢?
更正/建议欢迎.
谢谢.
由于配置文件是XML文件,因此您可以使用XPath查询执行此任务:
Configuration configFile = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location); XmlDocument document = new XmlDocument(); document.Load(configFile.FilePath); foreach (XmlNode node in document.SelectNodes("//add")) { string key = node.SelectSingleNode("@key").Value; string value = node.SelectSingleNode("@value").Value; Console.WriteLine("{0} = {1}", key, value); }
如果需要获取所有{key,value}对,则需要定义XPath查询的三元组:1 - 用于选择具有相似结构的节点的主查询.2,3-用于从第一查询检索的节点中提取键和值节点的查询.在您的情况下,它足以对所有节点进行通用查询,但很容易维护对不同自定义节的支持.