除了使用.net裡面提供的內建處理常式來處理我們的自訂節點外,我們還可以通過多種方法,來自己定義處理類處理我們的自訂節點,本文主要介紹通過實現IConfigurationSectionHandler介面的方式來實現自訂處理常式。
首先,我們先在設定檔裡面寫如下自訂節點:
<!-- 使用自訂節點和上面的自訂處理常式--> <mailServerGroup provider="www.baidu.com"> <mailServer client="http://blog.csdn.net/lhc1105"> <address>13232@qq.com</address> <userName>lhc</userName> <password>2343254</password> </mailServer> <mailServer client="http://www.cnblogs.com/liuhuichao/"> <address>132345232@qq.com</address> <userName>水田如雅</userName> <password>2343453254</password> </mailServer> </mailServerGroup>
然後寫對應類進行處理:
namespace MailHandlerClass{ public class MailServer { //儲存mailServer的子節點(<address>13232@qq.com</address><userName>lhc</userName><password>2343254</password>)的值 //以及client的值 private Hashtable serverNode; //建構函式 public MailServer() { serverNode = new Hashtable(); } public Hashtable ServerNode { get { return serverNode; } } public string client { get { return serverNode["client"] as string; } } public string Address { get { return serverNode["address"] as string; } } public string UserName { get { return serverNode["userName"] as string; } } public string PassWord { get { return serverNode["password"] as string; } } } //對應mailServerGroup public class MailServerConfig : List<MailServer> { //映射provider值 public string Provider { get; set; } } //自訂配置節點mailServerGroup的處理常式 public class MailServerConfigurationHandler : IConfigurationSectionHandler { //section為MailServerGroup節點 public object Create(object parent, object configContext, System.Xml.XmlNode section) { //設定方法返回設定物件,可以是任何類型 MailServerConfig config = new MailServerConfig(); //擷取節點的屬性資訊 config.Provider = section.Attributes["provider"] == null ? "" : section.Attributes["provider"].Value; //擷取MailServer節點 foreach (System.Xml.XmlNode child in section.ChildNodes) { MailServer server = new MailServer(); //添加Client屬性 if (child.Attributes["client"]!=null) { server.ServerNode.Add("client", child.Attributes["client"].Value); } //擷取MailServer下的Name,username,password節點 foreach (System.Xml.XmlNode grandChild in child.ChildNodes) { //添加文本 server.ServerNode.Add(grandChild.Name, grandChild.InnerText); } //將server加入MailServerConfig config.Add(server); } return config; }}}
其實從代碼可以看出,自訂處理類的實現思路還是用hashtable來實現key-value的讀取與儲存+對XML的處理;
之後,我們在設定檔中將上面的類和節點關聯起來:
<configuration> <!--定義處理mailServerGroup配置節的類--> <configSections> <section name="mailServerGroup" type="MailHandlerClass.MailServerConfigurationHandler,實現IConfigurationSectionHandler介面"/> <!--【注意】type:指定用來執行如下操作的配置節處理常式類的名稱:處理在 name 屬性中指定的節或元素中的配置設定。使用以下格式:type=" Fully qualified class name , assembly file name , version , culture , public key token "定義必須匹配程式集引用。--> </configSections>
一定要注意type指定值時參數的位置!!!!!不然會出現載入不上處理常式的錯誤。
寫段代碼測試下:
namespace MailHandlerClass{ //也可以通過繼承ConfigurationSection類來完成 class Program { static void Main(string[] args) { MailServerConfig mailServerConfig = (MailServerConfig)ConfigurationManager.GetSection("mailServerGroup"); //讀取節點值 mailServerConfig.ForEach(m => { Console.WriteLine(m.client+";"+m.Address+";"+m.UserName+";"+m.PassWord); }); } }}
額,其實還是建議強轉改為as啥的形式。
其實設定檔剛開始看起來是這樣的:
但是學完之後,你再看設定檔,就變成了這樣的:
以上就是.Net——實現IConfigurationSectionHandler介面定義處理常式處理自訂節點的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!