基于XML的配置文件访问接口设计和实现(2)

基于XML的配置文件访问接口设计和实现(2)

 

 

目录

    摘要

    XmlConfigWriter类的实现

    XmlConfigWriter类的使用

 

摘要

    在进行程序开发过程中,经常要将一些程序设置/使用的信息储存起来.由于这些信息和程序的设置/使用相关,与程序有相当的独立性,所以不可能硬编码到程序中.在这个时候我们选择使用基于Xml的配置文件进行存储.Microsoft.NET Framework提供了一系列的基于.Config文件的读取的类,System.Configuration 命名空间提供的AppSettings等类.但是此命名空间提供的类只能对配置文件进行读取,不能进行设置.所以在这里,我们实现自己的一个基于Xml的配置文件的类XmlConfigReader/XmlConfigWriter.

 

 

XmlConfigWriter类的实现

    由于要对配置文件进行写入,而且可能写入的次数比较多.所以这里我们不使用轻便的XmlTextWriter,使用XmlDocument.XmlDocument可以在内存中修改所有的Xml的节点,只有等到显式的调用Save函数的时候才会保存Xml文件.在有大量修改的时候,性能要好一些.

    同样的,先实现XmlConfigWriter的构造函数

     public class XmlConfigWriter

     {

         private string _filepath;

         private XmlDocument doc ;

         public XmlConfigWriter(string filepath)

         {

              _filepath = Path.GetFullPath(filepath);

              doc =new XmlDocument();

              doc.Load(_filepath);

         }

}

通过构造函数,将配置文件的路径传进去,同时调用XmlDocumentLoad方法,将此文件加载到内存中.

这里我们使用的是XmlDocument.它实现 W3C 文档对象模型 (DOM) 级别 1 核心 (Level 1 Core) 和核心 DOM 级别 2 (Core DOM Level 2)DOM XML 文档的内存中(缓存)树状表示形式,允许对该文档的导航和编辑.通过XmlDocument,我们就可以很方便的在内存中直接操作节点.

.对配置文件的写入,不外忽三种,一种就是新插入一个节点,一种就是对现有节点的修改,最后一个就是删除现有的节点.我们首先从插入开始入手.代码如下:

         private XmlNode CreateXmlNode(string localname){

              return doc.CreateNode(XmlNodeType.Element,localname,"");

         }

 

         private XmlAttribute CreateXmlAttribute(string localname){

              return doc.CreateAttribute("",localname,"");

         }

         public void AddSection(string section){

              XmlNode secNode = doc.SelectSingleNode("/configuration/"+section);

              if(secNode != null){

                   return;

              }

              doc.DocumentElement.AppendChild(CreateNode(section));

         }

 

         public void AddKey(string section,string key,string value){

              XmlNode secNode = doc.SelectSingleNode("/configuration/"+section);

              if( doc.SelectSingleNode("/configuration/" + section + "/add[@key=/"" + key + "/"]") != null)

              {

                   return;

              }

              XmlNode chi = CreateXmlNode("add");

              XmlAttribute att = CreateXmlAttribute("key");

              att.Value = key;

              chi.Attributes.Append(att);

              att = CreateXmlAttribute("value");

              att.Value = value;

              chi.Attributes.Append(att);

              secNode.AppendChild(chi);

         }

对于配置文件的插入,有两种情况,一个就是插入一个新的Section节点(appSettings/SockBaseSettings这样的节点),一个就是在当前的Section节点下面插入一个新的add节点.在上面的代码中,对于插入节点的操作,都是首先通过docSelectSingleNode函数来判断是否已存在此同名节点,如果存在,则直接return,避免创建同名的节点.但是,由于在最终使用的add节点是分属于不同的Section节点的,所以只是判断在同一个Section节点下面的此节点不能同名.

如果不存在同名的节点,就通过secNode.AppentChild函数将此新建的(通过CreateXmlNode函数)节点加入到doc对象中.同时,对于add节点,通过CreateXmlAttribute函数及XmNode.Attributes.Appent函数将其key / value属性加入到此节点中.这样,插入操作就完成了.

接着我们来完成删除操作.删除操作直接通过XmlDocumentSelectSingleNode得到目标节点的父节点,再通过XmlNode.RemoveChild操作将其删除.代码如下:

          public void DeleteSection(string section){

              XmlNode secNode = doc.SelectSingleNode("/configuration/"+section);

              doc.DocumentElement.RemoveChild(secNode);

     }

 

         public void DeleteKey(string section,string key){

              XmlNode secNode = doc.SelectSingleNode("/configuration/" + section + "/add[@key=/"" + key + "/"]");

              if(secNode != null)

              {

                   secNode.ParentNode.RemoveChild(secNode);

              }

     }

 

现在开始修改操作.对于修改操作,思路是这样的,首先通过XmlDocumentSelectSingleNode搜索,看是否有满足条件的节点.如果没有,直接return,如果存在,则分两情况.对于add节点,只是直接修改其value属性.对于Section节点,则是通过遍历把其下所有的子节点(add节点)得到,再把此Section节点删除,再生成一个新的节点(这个新的节点的Name就为要设置的值),再把得到的所有子节点再赋给这个新的节点.代码如下:

         public void ModifySection(string oldSection,string newSection){

              XmlNode secNode = doc.SelectSingleNode("/configuration/"+oldSection);

              XmlNodeList list = secNode.ChildNodes;

              doc.DocumentElement.RemoveChild(secNode);

              secNode = doc.CreateNode(XmlNodeType.Element,newSection,"");

              foreach( XmlNode i in list){

                   secNode.AppendChild(i);

              }

              doc.DocumentElement.AppendChild(secNode);

     }

 

         public void ModifyKey(string section,string key,string value){

              XmlNode secNode = doc.SelectSingleNode("/configuration/" + section + "/add[@key=/"" + key + "/"]");

              if(secNode != null)

              {

                   secNode.Attributes["value"].Value = value;

              }

     }

好了,插入,修改,删除操作到现在基本完成了,但是现在还只是在内存中进行操作,还不是对实际的文件进行操作.这个时候,我们就还得通过XmlDocument.Save函数把内存中修改好的Xml文件写入到文件中去.代码如下:

         public void Save(){

              doc.Save(_filepath);            

         }

         public void Save(string filepath)

         {

              doc.Save(filepath);

     }

 

XmlConfigWriter类的使用

    使用方法很简单.先产生一个XmlConfigWriter对象,通过构造函数把配置文件传进去,再通过Add/Modify/Delete等函数进行操作.代码如下:

XmlConfigWriter Writer = new XmlConfigWriter(@appconfig.xml);

Writer.AddSection(appSettings);

Writer.AddKey(appSettings,ServerIP,localhost);

Writer.ModifyKey(appSettings,ServerIP,127.0.0.1);

Writer.ModifySection(appSettings,SockBaseSettings);

Writer.DeleteKey(SockBaseSettings,ServerIP);

Writer.DeleteSection(SockBaseSettings);

Writer.Save();

 

总结

    通过编写XmlConfigWriter,我们学会使用XmlDocument的使用.

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值