西洛
任何人都可以向我解释如何从.config文件中获取配置元素。 我知道如何处理属性而不是元素。例如,我想解析以下内容:
<MySection enabled="true">
<header><![CDATA[ <div> .... </div> ]]></header>
<title> .... </title>
</MySection>
到目前为止,我的c#代码看起来像这样:
public class MyConfiguration : ConfigurationSection
{
[ConfigurationProperty("enabled", DefaultValue = "true")]
public bool Enabled
{
get { return this["enabled"].ToString().ToLower() == "true" ? true : false; }
}
[ConfigurationProperty("header")]
public string header
{
???
}
}
它适用于属性,如何处理元素(上面代码中的标题属性)?
答案 0 :(得分:6)
还有另一种方法可以做同样的事情。
我们可以通过覆盖DeserializeElement
方法来获取字符串值来创建一个元素:
public class EmailTextElement : ConfigurationElement {
public string Value { get; private set; }
protected override void DeserializeElement(XmlReader reader, bool s) {
Value = reader.ReadElementContentAs(typeof(string), null) as string;
}
}
答案 1 :(得分:4)
这是一个非常好的自定义配置部分设计工具,你可以使用(它是免费的):
Configuration Section Designer
编辑:
我正在研究MSDN,似乎自定义配置部分无法做到你想要的,即。从元素获取配置值。自定义配置元素可以包含其他配置元素,但配置值始终来自属性。
也许你可以将你的html片段放到其他文件中并从配置中引用它们,就像这样。
<MySection enabled="true">
<header filename="myheader.txt" />
<title filename="mytitle.txt" />
</MySection>
答案 2 :(得分:3)
继承ConfigurationElement类并覆盖其deserialize方法。使用新类来表示具有文本内容的元素。
http://www.codeproject.com/KB/XML/ConfigurationTextElement.aspx
答案 3 :(得分:2)
使用您的示例,您将覆盖ConfigurationElement中“header”的反序列化以获取CDATA值。
<MySection enabled="true">
<header name="foo"><![CDATA[ <div> .... </div> ]]></header>
<title> .... </title>
</MySection>
public sealed class HeaderSection: ConfigurationElement {
private string __Name, __CDATA;
[ConfigurationProperty("name", IsRequired = true)]
public string Name {
get {
return this.__Name;
}
set {
this.__Name = value;
}
}
[ConfigurationProperty("value", IsRequired = true)]
public string Value {
get {
return this.__CDATA;
}
set {
this.__CDATA = value;
}
}
protected override void DeserializeElement(System.Xml.XmlReader reader, bool s) {
this.Name = reader.GetAttribute("name").Trim();
string cdata = reader.ReadElementContentAs(typeof(string), null) as string;
this.Value = cdata.Trim();
}
}
答案 4 :(得分:0)
您可以使用ConfigurationManager.GetSection("SectionName")方法获取配置文件中的配置部分。
答案 5 :(得分:0)
我终于找到了一种方法。
有IConfigurationSectionHandler接口,允许我想要的东西。它需要一个人编写方法
public object Create(object parent, object configContext, XmlNode section)
在它之后,你自己解析部分所以我能够毫无问题地获取XmlElement:
header = s["header"] != null ? s["header"].InnerText : String.Empty;
title = s["title"] != null ? s["title"].InnerText : String.Empty;
这方面的缺点是接口已过时但MSDN声明它不会从框架的未来版本中删除,因为它在内部使用。
答案 6 :(得分:0)
您可以创建一个继承自System.Configuration.ConfigurationElement的类,该类表示配置部分中的元素。
答案 7 :(得分:0)
根据MSDN,在。NET 4 中有一个新的CurrentConfiguration
属性,它提供了对代表该代表的顶级Configuration
实例的引用当前ConfigurationElement
实例所属的配置层次结构。