C#XML配置文件自定义部分始终为空

问题描述:

使用VSTO Outlook加载项。我需要将配置参数存储在XML文件中。我正在努力解决一些基本的配置文件加载问题。我希望一个新的观点:C#XML配置文件自定义部分始终为空

customConfiguration.xml

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 

    <configSections> 
     <section name="CDSSettings" type="System.Configuration.NameValueSectionHandler" /> 
    </configSections> 

    <CDSSettings> 
    <add key="APIusername" value="myUser" /> 
    <add key="APIpassword" value="myPassword" /> 
    </CDSSettings> 

    <appSettings> 
     <add key="logLevel" value="0" /> 
    </appSettings> 
</configuration> 

代码

ExeConfigurationFileMap map = new ExeConfigurationFileMap(); 
map.ExeConfigFilename = "customConfiguration.xml"; 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 

AppSettingsSection appSettingsSection = (config.GetSection("appSettings") as AppSettingsSection); 
// --> All ok 

ConfigurationSection CDSSettings = (ConfigurationSection)config.GetSection("CDSSettings"); 
// --> How to get the APIusername key? 

任何机会,我能避免XML解析器或SectionInformation.GetRawXml()?

无法解释为什么ConfigurationManager.GetSectionconfig.GetSection返回不同的结果object,可在第一种情况下转化为NameValueCollection,并且部分是DefaultSection in second

我建议创建一个自定义部分,并使用它:

public class CDSSettings : ConfigurationSection 
{ 
    [ConfigurationProperty("MyValues")] 
    public KeyValueConfigurationCollection MyValues 
    { 
     get { return (KeyValueConfigurationCollection) this["MyValues"]; } 
     set { this["MyValues"] = value; } 
    } 
} 

和配置将看起来像

<section name="CDSSettings" type="UCAddin.CDSSettings, UCAddin" /> 
... 
<CDSSettings> 
    <MyValues> 
    <add key="APIusername" value="myUser" /> 
    <add key="APIpassword" value="myPassword" /> 
    </MyValues> 
</CDSSettings> 

检索代码:

var CDSSettings = (CDSSettings)config.GetSection("CDSSettings"); 

在自定义部分的情况下你也可以指定不同类型的字段,例如 你可以有不同的命名元素:

public class Credentials : ConfigurationElement 
{ 
    [ConfigurationProperty("login")] 
    public string Login 
    { 
     get { return (string)this["login"]; } 
     set { this["login"] = value; } 
    } 
} 

名为proerties

[ConfigurationProperty("credentials")] 
public Credentials Credentials 
{ 
    get { return (Credentials) this["credentials"]; } 
    set { this["credentials"] = value; } 
} 

和配置将看起来像

<CDSSettings> 
    <credentials login="testlogin" /> 
</CDSSettings> 

检查this MSDN article更多的可能性

作为的AppSettings 可以作为默认集合财产登记

public class CDSSettings : ConfigurationSection 
{ 

    [ConfigurationProperty("", IsDefaultCollection = true)] 
    public KeyValueConfigurationCollection MyValues => 
       (KeyValueConfigurationCollection) this[string.Empty]; 
} 

,并有参数在应用程序设置

<CDSSettings> 
    <add key="login" value="User" /> 
</CDSSettings> 

但在代码这些数据将会从属性访问(如果你不执行索引中该类)

var settings = (CDSSettings)config.GetSection("CDSSettings"); 
settings.MyValues 
+0

谢谢,看起来优雅。该代码引发“无法投射类型为”System.Configuration.DefaultSection“的对象以键入”UCAddin.CDSSettings“。”现在,但我认为它应该是可以修复的。任何机会我可以跳过MyValues标签?我希望XML尽可能地干净。 – Salim

+0

登录用户名密码忘记密码?添加到答案 – ASpirin

+0

添加其他可能的东西 – ASpirin