C# app.config中的自由格式XML配置节正文
有没有一种方法可以创建一个允许自由格式XML正文的配置部分?我如何在代码中获得自由形式的主体 例如,我想创建一个模块配置部分,如下所示:C# app.config中的自由格式XML配置节正文,c#,.net,configuration,C#,.net,Configuration,有没有一种方法可以创建一个允许自由格式XML正文的配置部分?我如何在代码中获得自由形式的主体 例如,我想创建一个模块配置部分,如下所示: <modules> <module name="ModuleA" type="My.Namespace.ModuleA, My.Assembly"> <moduleConfig> <serviceAddress>http://myserver/myservice.s
<modules>
<module name="ModuleA" type="My.Namespace.ModuleA, My.Assembly">
<moduleConfig>
<serviceAddress>http://myserver/myservice.svc</serviceAddress>
</moduleConfig>
</module>
<module name="ModuleB" type="My.Namespace.ModuleB, My.OtherAssembly">
<moduleConfig>
<filePath>c:\directory</filePath>
</moduleConfig>
</module>
</modules>
http://myserver/myservice.svc
c:\目录
因此,一些代码将使用ConfigurationManager.GetSection(“modules”)
从配置节中旋转这些模块类型,我希望将moduleConfig
元素中的XML作为不透明的配置值传递给模块类的构造函数
欢迎任何意见 我就是这样完成这项工作的:
public class ModuleElement : ConfigurationElement
{
[ConfigurationProperty("name", IsRequired = true)]
public string Name
{
get { return (string)base["name"]; }
set { base["name"] = value; }
}
XElement _config;
public XElement Config
{
get { return _config; }
}
protected override bool OnDeserializeUnrecognizedElement(string elementName, System.Xml.XmlReader reader)
{
if (elementName == "config")
{
_config = (XElement)XElement.ReadFrom(reader);
return true;
}
else
return base.OnDeserializeUnrecognizedElement(elementName, reader);
}
}
因此,xml看起来像:
<module name="ModuleA">
<config>
<filePath>C:\files\file.foo</filePath>
</config>
</module>
C:\files\file.foo
config元素的主体可以是任何您喜欢的自由格式xml。假设您设置了一个集合,当您执行
ConfigurationManager.GetSection(“模块”)
时,您可以访问每个ModuleElement
对象的Config
属性,作为表示配置元素节点XML的XElement。在我的应用程序中,我无法使用.NET 3.5框架。我使用了一种稍微不同的方法,并提出了以下代码:
public class ModuleSection : ConfigurationSection
{
private const string ELEMENT_NAME_CONFIG = "config";
private XmlNode _configNode;
[ConfigurationProperty("name", IsRequired = true)]
public string Name
{
get { return (string)base["name"]; }
set { base["name"] = value; }
}
public XmlNode Config
{
get { return _configNode; }
}
protected override bool OnDeserializeUnrecognizedElement(string elementName, XmlReader reader)
{
if(elementName.Equals(ELEMENT_NAME_CONFIG, StringComparison.Ordinal)) {
// Add the unrecognized element.
_configNode = _xmlDocument.ReadNode(reader);
return true;
} else {
return base.OnDeserializeUnrecognizedElement(elementName, reader);
}
}
}
您应该能够像在我的答案中保存
XElement
一样,为您想要的元素保留XmlNode
。我更新了你的代码来显示这一点。