循环遍历appConfig文件的不同部分

时间:2016-05-04 13:18:03

标签: c# app-config

我有一个AppConfig文件,如下所示。我试图循环配置并获取节名称,根据节名称,它应该选择适当的appSettings。例如,当第一部分是VehicleConfig时,它应该自动选择VehicleConfig的appSettings。我需要这个自动选择,因为我有多个部分,我必须根据部分名称获取不同部分的appSettings。

    <configuration>
     <configSections>
      <sectionGroup name = "mySection">
       <section name="VehicleConfig"/>
       <section name="LiveDownloaderConfig"/>
      </sectionGroup>
     </configSections>
     <VehicleConfig>
       <appSettings>
         <add key="FileRoot" value="C:\FilesToUpload" />
         <add key="Project" value="BigDataTest" />
         <add key="Dataset" value="StoreServer" />
       </appSettings>
     </VehicleConfig>
     <LiveDownloaderConfig>
       <appSettings>
        <add key="FileRoot" value="C:\FilesToUpload" />
        <add key="Project" value="BigDataTest" />
        <add key="Dataset" value="BQSMeasure" />
       </appSettings>
     </LiveDownloaderConfig>
  </configuration>

我尝试过这段代码,当第二个for-each循环被点击时,它会抛出错误“VehicleConfig中无法识别的元素appSettings”。我尝试删除appSettings,但随后抛出“无法识别的元素添加”。我想知道我是否可以在VehicleConfig中拥有这些元素。

 System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

 ConfigurationSectionGroupCollection sectionGroups = config.SectionGroups;

         foreach (ConfigurationSectionGroup group in sectionGroups)
        // Loop over all groups
        {
            Console.WriteLine(group);
            if (group.Name == "FileCheckerConfigGroup")
            {
                foreach (ConfigurationSection configurationSection in group.Sections)
                {
                    var section = ConfigurationManager.GetSection(configurationSection.SectionInformation.SectionName) as NameValueCollection;
                }
            }
        }

任何帮助表示赞赏!!

3 个答案:

答案 0 :(得分:2)

简单的方法是将文件视为普通的XML文件,并且可能使用XDocument,然后您可以使用linq查询...

var config = XDocument.Load(File.OpenRead("app.config"));
var sections = config.Descendants("configuration");

foreach(var section in sections) {
    // stuff
}

要获取特定的部分设置,您希望使用更深的xpath表达式...

var sectionName = "VehicleConfig";
var settings = config.Descendants("configuration/" + sectionName + "/appSettings");

然后您可以使用上面的简单foreach遍历这些设置

答案 1 :(得分:1)

请尝试使用此

node.exe

答案 2 :(得分:1)

通常我们会通过Configuration到达ConfigurationManager。但在这种情况下,您需要直接转到Configuration对象。这有点令人讨厌,因为您访问它的方式因Web应用程序和其他应用程序而异。

以下是一些示例:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/")

获得对该对象的引用后,您可以使用其.SectionGroups.Sections属性来迭代各个部分。

阅读评论后,我认为这更具体地说是您正在寻找的内容。我忘记了完全不直观的配置部分。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="mySettings" type="System.Configuration.AppSettingsSection"/>
    <section name="myOtherSettings" type="System.Configuration.AppSettingsSection"/>
  </configSections>
  <mySettings>
    <add key="foo" value="bar"/>
  </mySettings>
  <myOtherSettings>
    <add key="yourUncle" value="bob" />
  </myOtherSettings>
</configuration>

然后阅读它们,

class Program
{
    static void Main(string[] args)
    {
        var configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        foreach (var sectionKey in configuration.Sections.Keys)
        {
            var section = configuration.GetSection(sectionKey.ToString());
            var appSettings = section as AppSettingsSection;
            if (appSettings == null) continue;
            Console.WriteLine(sectionKey);
            foreach (var key in appSettings.Settings.AllKeys)
            {
                Console.WriteLine("  {0}: {1}", key, appSettings.Settings[key].Value);
            }
        }
        Console.ReadLine();
    }
}

输出:

appSettings  
myOtherSettings    
  yourUncle: bob  
mySettings   
  foo: bar  

你需要添加一些额外的东西来迭代嵌套的配置部分,但我不能没有任何乐趣。