本文转自:http://www.xland.com.cn/article/7/12/0601/7887.htm
既然我们能够使用DATASET来操作XML文件,那真实太方便了,他完全有能力将一个XML文件当作一张表来使用,那又何乐而不为呢?
于是我们可以同过这样的一个C#类来操作XML,完成类似数据库般的操作:
using System;
using System.Text;
using System.IO;
using System.Xml;
using System.Data;
namespace XmlBook.Com.Sem.Tools
{
/// <summary>
/// 版权: Copyright by SEM IT Department
/// 版本: 0.0.1
/// 文件: XmlBook.Com.Sem.Tools.XmlDataBase.cs
/// 目的: 提供将XML当作数据库处理的一些方法
/// 作者: 欧阳云天 @2005-04-09
/// 邮箱: outrace@soueast-motor.com
/// 修改:
/// </summary>
public class XmlDataBase
{
#region 私有成员
private string strDataFile = null;
/// <summary>
/// 数据集
/// </summary>
private DataSet myDs = null;
/// <summary>
/// 字符过滤数组 比如 "id='1' and userName='trace'"
/// </summary>
private string strFilter = null;
/// <summary>
/// 排序的字段 比如 "id desc,userName"
/// </summary>
private string strSort = null;
/// <summary>
/// 数据集合中的字段名集合
/// </summary>
private string[] strFields = null;
/// <summary>
/// 数据集合中的数据数组
/// </summary>
private string[] strData = null;
/// <summary>
/// 模板文件的全路径
/// </summary>
private string strTemplateFile = null;
#endregion
#region 公共属性
/// <summary>
/// 模板文件路径
/// </summary>
public string StrTemplateFile
{
set{this.strTemplateFile = value;}
get{return this.strTemplateFile;}
}
/// <summary>
/// 数据文件路径
/// </summary>
public string StrDataFile
{
set{this.strDataFile = value;}
get{return this.strDataFile;}
}
/// <summary>
/// 字符过滤数组
/// </summary>
public string StrFilter
{
set{this.strFilter = value;}
}
/// <summary>
/// 排序的字段
/// </summary>
public string StrSort
{
set{this.strSort = value;}
}
/// <summary>
/// 数据集合中的字段名
/// </summary>
public string[] StrFields
{
set{this.strFields = value;}
}
/// <summary>
/// 数据集合中的数据数组
/// </summary>
public string[] StrData
{
set{this.strData = value;}
}
/// <summary>
/// 数据集合,可以放在缓存供调用
/// </summary>
public DataSet MyDs
{
set{this.myDs = value;}
get{return this.myDs;}
}
#endregion
public XmlDataBase()
{
//
// TODO: 提供将XML当作数据库处理的一些方法
//
}
/// <summary>
/// 取得XML文件的内容并填入DataSet
/// </summary>
private void Open()
{
try
{
this.myDs = new DataSet();
FileStream fin ;
fin = new FileStream(this.strDataFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
this.myDs.ReadXml(fin);
fin.Close();
}
catch(Exception ee)
{
Log log = new Log();
log.StrUser = "系统";
log.StrDepartment = "读取XML数据";
log.StrFileName = "Com.Sem.Tools.XmlDataBase";
log.StrDescription = ee.Message;
log.WriteLog();
}
}
/// <summary>
/// 将操作结果写入XML
/// </summary>
private void Save()
{
try
{
this.myDs.WriteXml(this.strDataFile, XmlWriteMode.WriteSchema);
}
catch(Exception ee)
{
Log log = new Log();
log.StrUser = "系统";
log.StrDepartment = "保存XML数据";
log.StrFileName = "Com.Sem.Tools.XmlDataBase";
log.StrDescription = ee.Message;
log.WriteLog();
}
}
/// <summary>
/// 取得特定的数据视图
/// 一般在数据绑定的时候,我们可以很方便的生成供绑定的视图
/// </summary>
/// <returns>数据视图</returns>
public DataView SelectView()
{
if(this.myDs == null) this.Open();
DataView myDv = new DataView(this.myDs.Tables[0]);
if (strFilter != null) myDv.RowFilter = this.strFilter;
myDv.Sort = this.strSort;
return myDv;
}
/// <summary>
/// 取得特定的行
/// 使用行的方式是因为有些时候,我们仅仅只需要某一行或多行记录
/// 比如我们判断登陆的时候,只是需要某个ID的所在行,然后匹配它的密码项
/// </summary>
/// <returns>各行数据</returns>
public DataRow[] SelectRows()
{
if(this.myDs == null) this.Open();
DataRow[] myRows = myDs.Tables[0].Select(this.strFilter);
return myRows;
}
/// <summary>
/// 往XML当中插入一条数据
/// </summary>
/// <returns>操作是否成功</returns>
public bool Insert()
{
if(this.myDs == null) this.Open();
try
{
DataRow newRow = myDs.Tables[0].NewRow();
for (int i = 0; i < this.strFields.Length; i++)
{
newRow[this.strFields[i]] = this.strData[i];
}
myDs.Tables[0].Rows.Add(newRow);
this.Save();
return true;
}
catch(Exception ee)
{
Log log = new Log();
log.StrUser = "系统";
log.StrDepartment = "写入XML数据";
log.StrFileName = "Com.Sem.Tools.XmlDataBase";
log.StrDescription = ee.Message;
log.WriteLog();
return false;
}
}
/// <summary>
/// 更新数据,这个时候要确保strFields 与 strData 两个数组的维数一致
/// </summary>
/// <returns>是否更新成功</returns>
public bool Update()
{
if(this.myDs == null) this.Open();
try
{
DataRow[] editRow = myDs.Tables[0].Select(this.strFilter);
for(int j=0; j< editRow.Length; j++)
{
for (int i = 0; i < this.strFields.Length; i++)
{
editRow[j][this.strFields[i]] = this.strData[i];
}
}
this.Save();
return true;
}
catch(Exception ee)
{
Log log = new Log();
log.StrUser = "系统";
log.StrDepartment = "更新XML数据";
log.StrFileName = "Com.Sem.Tools.XmlDataBase";
log.StrDescription = ee.Message;
log.WriteLog();
return false;
}
}
/// <summary>
/// 删除数据
/// </summary>
/// <returns>是否删除成功</returns>
public bool Delete()
{
if(this.myDs == null) this.Open();
try
{
DataRow[] editRow = myDs.Tables[0].Select(this.strFilter);
for(int i=0;i<editRow.Length;i++)
{
editRow[i].Delete();
}
this.Save();
return true;
}
catch(Exception ee)
{
Log log = new Log();
log.StrUser = "系统";
log.StrDepartment = "删除XML数据";
log.StrFileName = "Com.Sem.Tools.XmlDataBase";
log.StrDescription = ee.Message;
log.WriteLog();
return false;
}
}
/// <summary>
/// 根据一个模板,新建一个XML文件(前提是必须有一个模板文件、并确定目标文件路径)
/// </summary>
/// <returns>写入是否成功</returns>
public bool Create()
{
try
{
XmlDocument doc = new XmlDocument();
XmlTextReader reader = new XmlTextReader(this.strTemplateFile);
doc.Load(reader);
XmlElement member;
XmlNode root = doc.DocumentElement;
for (int i = 0; i < this.strFields.Length; i++)
{
member = doc.CreateElement(strFields[i].ToString());
member.InnerText = this.strData[i].ToString();
root.AppendChild(member);
}
XmlTextWriter xmlWriter = new XmlTextWriter(this.strDataFile,null);
xmlWriter.Formatting = Formatting.Indented;
doc.Save(xmlWriter);
xmlWriter.Close();
reader.Close();
return true;
}
catch(Exception ee)
{
Log log = new Log();
log.StrUser = "系统";
log.StrDepartment = "新建XML数据";
log.StrFileName = "Com.Sem.Tools.XmlDataBase";
log.StrDescription = ee.Message;
log.WriteLog();
return false;
}
}
/// <summary>
/// 释放资源
/// </summary>
public void Clear()
{
if (this.myDs != null)
{
this.myDs.Dispose();
}
}
}
}
类中引入了另外一个LOG处理的类,在这里一并发给大家
using System;
using System.Xml;
using System.Web;
namespace XmlBook.Com.Sem.Tools
{
/// <summary>
/// 版权: Copyright by SEM IT Department
/// 版本: 0.0.1
/// 文件: XmlBook.Com.Sem.Tools.Log.cs
/// 目的: 提供一个写LOG的方法(就是将错误写入XML记录当中)
/// 作者: 欧远宁 @2005-04-09
/// 邮箱: outrace@soueast-motor.com
/// 修改:
/// </summary>
public class Log
{
#region 私有成员
private HttpContext objContext = HttpContext.Current;
/// <summary>
/// 日志文件路径
/// </summary>
private string logFile = null;
/// <summary>
/// 操作人员
/// </summary>
private string strUser = null;
/// <summary>
/// 所属版块
/// </summary>
private string strDepartment = null;
/// <summary>
/// 正在操作的文件名
/// </summary>
private string strFileName = null;
/// <summary>
/// 操作时间
/// </summary>
private string strTime = null;
/// <summary>
/// 错误描述
/// </summary>
private string strDescription = null;
#endregion
#region 公共属性
/// <summary>
/// 操作人员
/// </summary>
public string StrUser
{
get{return this.strUser;}
set{this.strUser = value;}
}
/// <summary>
/// 正在操作的文件名
/// </summary>
public string StrFileName
{
get{return this.strFileName;}
set{this.strFileName = value;}
}
/// <summary>
/// 所属版块
/// </summary>
public string StrDepartment
{
get{return this.strDepartment;}
set{this .strDepartment = value;}
}
/// <summary>
/// 操作时间
/// </summary>
public string StrTime
{
get{return this.strTime;}
set{this.strTime = value;}
}
/// <summary>
/// 错误描述
/// </summary>
public string StrDescription
{
get{return this.strDescription;}
set{this.strDescription = value;}
}
#endregion
public Log()
{
//
// TODO: 提供一个写LOG的方法(就是将错误写入XML记录当中)
//
}
/// <summary>
/// 将内容写入日志文件
/// </summary>
public void WriteLog()
{
this.logFile = this.objContext.Server.MapPath("./Log/log.config");
try
{
XmlDocument doc = new XmlDocument();
doc.Load(this.logFile);
XmlElement newLog = doc.CreateElement("Log");
XmlElement newUser = doc.CreateElement("User");
newUser.InnerText = this.strUser;
newLog.AppendChild(newUser);
XmlElement newDepartment = doc.CreateElement("Department");
newDepartment.InnerText = this.strDepartment;
newLog.AppendChild(newDepartment);
XmlElement newFileName = doc.CreateElement("FileName");
newFileName.InnerText = this.StrFileName;
newLog.AppendChild(newFileName);
XmlElement newTime = doc.CreateElement("Time");
newTime.InnerText = DateTime.Now.ToString();
newLog.AppendChild(newTime);
XmlElement newDescription = doc.CreateElement("Description");
newDescription.InnerText = this.strDescription;
newLog.AppendChild(newDescription);
doc.DocumentElement.AppendChild(newLog);
doc.Save(this.logFile);
}
catch(Exception ex)
{
HttpContext objContext = HttpContext.Current;
objContext.Response.Write(ex.Message);
}
finally
{
}
}
}
}
这样我们就可以非常方便的将一个XML文件当作是一张表来操作了
使用的例子:
我们提供了一个类,用来操作XML文件,这里提供一个应用的例子,来源于无聊时候写的一个XML留言本中对留言数据的处理
代码如下:
private string strFilter = null;
#endregion
#region 公有成员
/// <summary>
/// 姓名
/// </summary>
public string StrName
{
get{return this.strName;}
set{this.strName = value;}
}
/// <summary>
/// 性别
/// </summary>
public string StrSex
{
get{return this.strSex;}
set{this.strSex = value;}
}
/// <summary>
/// 邮箱
/// </summary>
public string StrEmail
{
get{return this.strEmail;}
set{this.strEmail = value;}
}
/// <summary>
/// 主页
/// </summary>
public string StrPage
{
get{return this.strPage;}
set{this.strPage = value;}
}
/// <summary>
/// OICQ号码
/// </summary>
public string StrQQ
{
get{return this.strQQ;}
set{this.strQQ = value;}
}
/// <summary>
/// 主题
/// </summary>
public string StrSubject
{
get{return this.strSubject;}
set{this.strSubject = value;}
}
/// <summary>
/// 内容
/// </summary>
public string StrContent
{
get{return this.strContent;}
set{this.strContent = value;}
}
/// <summary>
/// 回复
/// </summary>
public string StrReply
{
get{return this.strReply;}
set{this.strReply = value;}
}
/// <summary>
/// ID号
/// </summary>
public string StrID
{
get{return this.strID;}
set{this.strID = value;}
}
public string StrFilter
{
get{return this.strFilter;}
set{this.strFilter = value;}
}
#endregion
public MdlDataManage()
{
//
// TODO: 留言数据相关的操作
//
}
/// <summary>
/// 新增一条留言(这里演示如何新增一笔记录)
/// </summary>
public void Add()
{
string [] arrFileds = new string[10];
string [] arrValues = new string[10];
arrFileds[0] = "ID";
arrFileds[1] = "Name";
arrFileds[2] = "Sex";
arrFileds[3] = "Email";
arrFileds[4] = "Page";
arrFileds[5] = "QQ";
arrFileds[6] = "Subject";
arrFileds[7] = "Content";
arrFileds[8] = "Reply";
arrFileds[9] = "DateTime";
arrValues[0] = DateTime.Now.ToFileTime().ToString();
arrValues[1] = this.strName;
arrValues[2] = this.strSex;
arrValues[3] = this.strEmail;
arrValues[4] = this.strPage;
arrValues[5] = this.strQQ;
arrValues[6] = this.strSubject;
arrValues[7] = this.strContent;
arrValues[8] = "no reply";
arrValues[9] = DateTime.Now.ToString();
try
{
XmlDataBase xml = new XmlDataBase();
xml.StrDataFile = Config.DataFile;
xml.StrFields = arrFileds;
xml.StrData = arrValues;
xml.Insert();
xml.Clear();
}
catch(Exception ee)
{
Log log = new Log();
log.StrUser = "系统";
log.StrDepartment = "签写留言";
log.StrFileName = "XmlBook.Component.MdlDataManage.cs";
log.StrDescription = ee.Message;
log.WriteLog();
}
}
/// <summary>
/// 回复留言(这里演示如何修改某一笔XML记录)
/// </summary>
public void Reply()
{
string [] arrFileds = new string[1];
string [] arrValues = new string[1];
arrFileds[0] = "Reply";
arrValues[0] = this.strReply;
try
{
XmlDataBase xml = new XmlDataBase();
xml.StrDataFile = Config.DataFile;
xml.StrData = arrValues;
xml.StrFields = arrFileds;
xml.StrFilter = "ID='"+this.StrID+"'";
xml.Update();
xml.Clear();
}
catch(Exception ee)
{
Log log = new Log();
log.StrUser = "系统";
log.StrDepartment = "回复数据";
log.StrFileName = "XmlBook.Component.MdlDataManage.cs";
log.StrDescription = ee.Message;
log.WriteLog();
}
}
/// <summary>
/// 删除留言(这里演示如何删除一笔记录)
/// </summary>
public void Delete()
{
try
{
XmlDataBase xml = new XmlDataBase();
xml.StrDataFile = Config.DataFile;
xml.StrFilter = "ID = '"+ this.strID +"'";
xml.Delete();
xml.Clear();
}
catch(Exception ee)
{
Log log = new Log();
log.StrUser = "系统";
log.StrDepartment = "回复数据";
log.StrFileName = "XmlBook.Component.MdlDataManage.cs";
log.StrDescription = ee.Message;
log.WriteLog();
}
}
/// <summary>
/// 获取几行行留言数据(这里演示获取一行或多行数据)
/// </summary>
/// <returns>各行数据</returns>
public DataRow[] GetOneRow()
{
XmlDataBase xml = new XmlDataBase();
DataRow[] dr = null;
try
{
xml.StrDataFile = Config.DataFile;
xml.StrFilter = this.strFilter;
dr = xml.SelectRows();
return dr;
}
catch(Exception ee)
{
Log log = new Log();
log.StrUser = "系统";
log.StrDepartment = "获取一行数据";
log.StrFileName = "XmlBook.Component.MdlDataManage.cs";
log.StrDescription = ee.Message;
log.WriteLog();
return dr;
}
finally
{
xml.Clear();
}
}
/// <summary>
/// 获取视图
/// </summary>
/// <returns>视图</returns>
public DataView GetView()
{
XmlDataBase xml = new XmlDataBase();
DataView dv = null;
try
{
xml.StrDataFile = Config.DataFile;
xml.StrFilter = this.strFilter;
dv = xml.SelectView();
return dv;
}
catch(Exception ee)
{
Log log = new Log();
log.StrUser = "系统";
log.StrDepartment = "获取视图";
log.StrFileName = "XmlBook.Component.MdlDataManage.cs";
log.StrDescription = ee.Message;
log.WriteLog();
return dv;
}
finally
{
xml.Clear();
}
}
}
}