用xml做配置文件详解

用xml做配置文件详解  


  用xml文件做配置文件,我因为刚刚做完一个播放器,有点心得。每种xml文件都必须写个类,就像三层架构中一样,每个表必须要有三个类一样,一个model,一个dal,一个bll。我深深地觉得配置文件也应当用一个类或多个类进行封装。业务层只调用这个封装的类,而不用越过它直接用System.Xml中的类去存取。且看我写的实例。
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Text.RegularExpressions;
using System.IO;

namespace PlayerApp
{

    /// <summary>
    /// 播放列表类
    /// </summary>
    public class PlayList
    {

        private List<Media> _mediaList = new List<Media>();
        private string _filePath = "";



        #region 属性

        /// <summary>
        /// 播放列表中的媒体
        /// </summary>
        public List<Media> MediaList
        {
            get { return _mediaList; }
        }


        /// <summary>
        /// 播放列表的加载的路径
        /// </summary>
        public string PlayListPath
        {
            get { return _filePath; }
            set { _filePath = value; }
        }


        #endregion



        public PlayList(string path)
        {
            this.Load(path);
        }


        /// <summary>
        /// 将播放列表加载至此实例
        /// </summary>
        /// <param name="path"></param>
        public void Load(string path)
        {

            XmlDocument xmlDoc = new XmlAccess(path).Document;

            XmlNodeList list = xmlDoc.SelectNodes(@"/PlayList/*");
            foreach (XmlNode node in list)
            {
                Media m = new Media();
                m.Name = node.SelectSingleNode("name").InnerText;
                m.Path = node.SelectSingleNode("path").InnerText;
                m.Type = node.SelectSingleNode("type").InnerText;

                _mediaList.Add(m);

            }

            xmlDoc = null;
        }



        /// <summary>
        /// 将此实例中的数据保存至播放列表文件中
        /// </summary>
        /// <param name="path"></param>
        public void Save(string path)
        {
            XmlAccess xml = new XmlAccess(path);

            //先删除原有内容
            xml.Delete(@"/PlayList/*", false);

            //将列表中的数据保存至xml
            foreach (Media m in _mediaList)
            {
                string content = "<type>{0}</type><name>{1}</name><path>{2}</path>";
                content = string.Format(content, XmlAccess.Quote(m.Type), XmlAccess.Quote(m.Name), XmlAccess.Quote(m.Path));
                xml.InsertElement("/PlayList", "media", content);
            }
            xml.Save();
            xml.Dispose();
        }



        /// <summary>
        /// 加入音频文件
        /// </summary>
        /// <param name="m"></param>
        public void AddMedia(Media m)
        {
            _mediaList.Add(m);
        }



        /// <summary>
        /// 从列表中删除制定文件
        /// </summary>
        /// <param name="m"></param>
        public void Delete(Media m)
        {
            _mediaList.Remove(m);
        }



        /// <summary>
        /// 清空播放列表
        /// </summary>
        public void Clear()
        {
            _mediaList.Clear();
        }


        /// <summary>
        /// 在列表中查找文件
        /// </summary>
        /// <param name="reg">正则表达式</param>
        /// <returns></returns>
        public List<Media> Find(string reg)
        {
            List<Media> result = new List<Media>();
            foreach (Media m in _mediaList)
                if(Regex.IsMatch(Path.GetFileNameWithoutExtension(m.Path),reg)) result.Add(m);

            return result;
        }


    }



    /// <summary>
    /// 表示播放列表中的媒体信息
    /// </summary>
    public class Media
    {
        private string _name = "";
        private string _path = "";
        private string _type = "";

        /// <summary>
        /// 媒体的标题名(用于显示在播放列表里面)
        /// </summary>
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        /// <summary>
        /// 媒体所代表文件的路径
        /// </summary>
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }


        /// <summary>
        /// 媒体是音频(0)还是视频(1)
        /// </summary>
        public string Type
        {
            get { return _type; }
            set { _type = value; }
        }



        /// <summary>
        /// 此媒体是否为音频
        /// </summary>
        /// <returns></returns>
        public bool IsAudio()
        {
            return _type.Trim() == "0" ? true : false;
        }
    }

}


  这儿有两个类,一个是PlayList类,播放列表类,一个是Media。媒体类,代表一个媒体文件。我播放列表文件的结构如下:
<?xml version="1.0" encoding="utf-8"?>
<PlayList>
  <media>
    <type>0</type>
    <name>江南</name>
    <path>E:\dotnet\TestWinApp\TestWinApp\music\江南.mp3</path>
  </media>
  <media>
    <type>1</type>
    <name>新不了情-015</name>
    <path>F:\电视剧\新不了情\新不了情-015.rmvb</path>
  </media>
  <media>
    <type>1</type>
    <name>新不了情-016</name>
    <path>F:\电视剧\新不了情\新不了情-016.rmvb</path>
  </media>
</PlayList>
  这个播放列表定义得很简单。由上可总结,像<media>这种节点,最好定义一个相关联的类,这样,就更显得结构合理,清晰。另外,这样的类有一个特点,它有三个必备的东西:
  一、加载函数
  二、保存函数
  三、与配置文件中相关内容相应的成员(加载与保存都以此为纽带)
  关于存取xml,我根据前面讲过的代码,修改了一下,得XmlAccess,如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;


namespace PlayerApp
{

    /// <summary>
    /// 这个类有借鉴价值,有空来加强加强
    /// </summary>
    public class XmlAccess
    {
        /// <summary>
        /// 要处理的xml的路径
        /// </summary>
        protected string strXmlFile;
        protected XmlDocument objXmlDoc = new XmlDocument();


        /// <summary>
        /// 获得对应的xmlDocument对象,有时不得己要用到
        /// ,在某些情况下,这个类并不能满足需求时,就得
        /// 老老实实地用System.Xml下的API了。
        /// </summary>
        public XmlDocument Document
        {
            get { return objXmlDoc; }
        }



        public XmlAccess(string xmlFile)
        {
            try { objXmlDoc.Load(xmlFile); }
            catch (System.Exception ex)
            {
                throw ex;
            }
            strXmlFile = xmlFile;
        }




        /// <summary>
        /// 将指定xpath的节点用指定内容替换。当然是替换InnerText。
        /// </summary>
        /// <param name="xmlPathNode"></param>
        /// <param name="content"></param>
        public void Replace(string xmlPathNode, string content)
        {
            objXmlDoc.SelectSingleNode(xmlPathNode).InnerText = content;
        }



        /// <summary>
        /// 删除指定节点
        /// </summary>
        /// <param name="node">xpath</param>
        /// <param name="bSingle">是否只删除单个节点</param>
        public void Delete(string node,bool bSingle)
        {
            if (bSingle)
            {
                XmlNode n = objXmlDoc.SelectSingleNode(node);
                n.ParentNode.RemoveChild(n);
            }
            else
            {
                XmlNodeList list = objXmlDoc.SelectNodes(node);
                foreach (XmlNode n in list)
                {
                    n.ParentNode.RemoveChild(n);
                }
            }
        }


        /// <summary>
        /// 插入节点,在mainNode下创建childNode,然后为childNode创建子节点element,
        /// element的InnerText为content
        /// </summary>
        /// <param name="mainNode"></param>
        /// <param name="childNode"></param>
        /// <param name="element"></param>
        /// <param name="content"></param>
        public void InsertNode(string mainNode, string childNode, string element, string content)
        {
            XmlNode objRootNode = objXmlDoc.SelectSingleNode(mainNode);
            XmlElement objChildNode = objXmlDoc.CreateElement(childNode);
            objRootNode.AppendChild(objChildNode);
            XmlElement objElement = objXmlDoc.CreateElement(element);
            objElement.InnerText = content;
            objChildNode.AppendChild(objElement);
        }


        /// <summary>
        /// 在mainNode下创建子元素节点element,并设置它的attrib属性为attribContent,
        /// 将其innerXml设为xmlContent,功能强大。且返回此插入的元素节点的引用。
        /// </summary>
        /// <param name="mainNode">父结点</param>
        /// <param name="element">要插入元素的标签名</param>
        /// <param name="attrib">要设置的属性</param>
        /// <param name="attribContent">要设置的属性值</param>
        /// <param name="xmlContent">要设置的xml内容</param>
        /// <returns>插入元素的引用</returns>
        public XmlElement InsertElement(string mainNode, string element, string attrib, string attribContent, string xmlContent)
        {
            XmlNode objNode = objXmlDoc.SelectSingleNode(mainNode);
            XmlElement objElement = objXmlDoc.CreateElement(element);
            objElement.SetAttribute(attrib, attribContent);
            objElement.InnerXml = xmlContent;
            objNode.AppendChild(objElement);

        }


        /// <summary>
        /// 在mainNode创建指定元素element,并且设其xml内容为xmlContent,
        /// 且返回插入的元素节点引用
        /// </summary>
        /// <param name="mainNode">父节点</param>
        /// <param name="element">要插入元素的标签名</param>
        /// <param name="xmlContent">要插入元素的xml内容</param>
        /// <returns>插入元素的引用</returns>
        public XmlElement InsertElement(string mainNode, string element, string xmlContent)
        {
            XmlNode objNode = objXmlDoc.SelectSingleNode(mainNode);
            XmlElement objElement = objXmlDoc.CreateElement(element);
            objElement.InnerXml = xmlContent;
            objNode.AppendChild(objElement);
            return objElement;
        }



        /// <summary>
        /// 读取指定节点的某属性值
        /// </summary>
        /// <param name="xpath"></param>
        /// <param name="attr"></param>
        /// <returns></returns>
        public string GetAttribute(string xpath, string attr)
        {
            XmlNode node = objXmlDoc.SelectSingleNode(xpath);
            return node.Attributes[attr].Value;
        }



        /// <summary>
        /// 写指定节点的某属性
        /// </summary>
        /// <param name="xpath"></param>
        /// <param name="attr"></param>
        /// <param name="value"></param>
        public void SetAttribute(string xpath, string attr, string value)
        {
            XmlNode node = objXmlDoc.SelectSingleNode(xpath);
            node.Attributes[attr].Value = value;
            Save();
        }



        /// <summary>
        /// 查到的所有节点的InnerText的数组
        /// </summary>
        /// <param name="xmlPathNode"></param>
        /// <returns></returns>
        public string[] GetNodeList(string xmlPathNode)
        {
            XmlNodeList xnList = objXmlDoc.SelectNodes(xmlPathNode);
            string[] strArr = new string[xnList.Count];
            for (int i = 0; i < xnList.Count; i++)
            {
                strArr[i] = xnList[i].InnerText;
            }
            return strArr;
        }



        /// <summary>
        /// 满足xpath且某属性的值为指定的值的节点的InnerText
        /// </summary>
        /// <param name="xmlPathNode"></param>
        /// <param name="attrib"></param>
        /// <param name="attribContent"></param>
        /// <returns></returns>
        public string GetNodeText(string xmlPathNode, string attrib, string attribContent)
        {
            string xnStr = "";
            XmlNodeList xnList = objXmlDoc.SelectNodes(xmlPathNode);
            foreach (XmlNode xn in xnList)
            {
                if (xn.Attributes[attrib] != null)
                {
                    if (xn.Attributes[attrib].Value == attribContent)
                    {
                        xnStr = xn.InnerText;
                        break;
                    }
                }
            }
            return xnStr;
        }



        /// <summary>
        /// 获得满足指定XPath的第一个元素的innerText
        /// </summary>
        /// <param name="xmlPathNode"></param>
        /// <returns></returns>
        public string GetNodeText(string xmlPathNode)
        {
            return objXmlDoc.SelectSingleNode(xmlPathNode).InnerText;
        }



        /// <summary>
        /// 设置满足指定XPath的第一个元素的innerText
        /// </summary>
        /// <param name="xpath"></param>
        /// <param name="text"></param>
        public void SetNodeText(string xpath, string text)
        {
            objXmlDoc.SelectSingleNode(xpath).InnerText = text;
        }


        /// <summary>
        /// 保存修改
        /// </summary>
        public void Save()
        {
            try
            {
                objXmlDoc.Save(strXmlFile);
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            //objXmlDoc = null;
        }



        /// <summary>
        /// 释放资源
        /// </summary>
        public void Dispose()
        {
            objXmlDoc = null;
        }


        /// <summary>
        /// 为字符串的某些特殊字符转义
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static string Quote(string input)
        {
            input = input.Replace("&", "&amp;");
            input = input.Replace("<", "&lt;");
            input = input.Replace(">", "&gt;");
            input = input.Replace("\"", "&quot;");
            input = input.Replace("\'", "&apos;");


            return input;
        }

    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值