用xml做配置文件详解
2016-06-30 08:31
330 查看
用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("&", "&");
input = input.Replace("<", "<");
input = input.Replace(">", ">");
input = input.Replace("\"", """);
input = input.Replace("\'", "'");
return input;
}
}
}
相关文章推荐
- Cordova Geolocation以及baidu_map
- Codeforces Round #360(div2)
- 放大镜
- Anroid搭建一个局域网Web服务器
- Qt Quick里的图形效果:阴影(Drop Shadow)
- 没有自动联想补齐代码的解决办法
- 指尖下的js ——多触式web前端开发之一:对于Touch的处理
- 基本分段存储管理方式
- 安卓简单开发-安卓自带几种动画效果
- 14.1 threading--多线程
- 抽象方法不能是static或native或synchroniz
- 【伸展树splay学习小记】
- 注解开发--基础
- iOS 开发中的争议(二)
- 【bzoj1588】【HNOI2002】【营业额统计】【splay】
- mysql+hibernate 一些报错
- 第三方的使用
- iOS 开发中的争议(一)
- Hourai Jeweled
- JavaScript中的匿名函数及函数的闭包