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.GetSection
和config.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
谢谢,看起来优雅。该代码引发“无法投射类型为”System.Configuration.DefaultSection“的对象以键入”UCAddin.CDSSettings“。”现在,但我认为它应该是可以修复的。任何机会我可以跳过MyValues标签?我希望XML尽可能地干净。 – Salim
登录用户名密码忘记密码?添加到答案 – ASpirin
添加其他可能的东西 – ASpirin