博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

将XML当作数据库处理的通用的XML处理方法

Posted on 2008-07-26 10:10  codingsilence  阅读(372)  评论(0)    收藏  举报

下载

既然我们能够使用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>
            /// 文件: XmlBook.Com.Sem.Tools.XmlDataBase.cs
            /// 目的: 提供将XML当作数据库处理的一些方法
            /// 修改:
            /// </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留言本中对留言数据的处理

using System;
            using System.IO;
            using System.Data;
            using System.Diagnostics;
            using XmlBook.Com.Sem.Tools;   //这里就包含了上一篇提供的类
            namespace XmlBook.Component
            {
            /// <summary>
            /// 版权: Copyright by SEM IT Department
            /// 版本: 0.0.1
            /// 文件: XmlBook.Component.MdlDataMange.cs
            /// 目的: 留言数据相关的操作
            /// 作者: 欧远宁 @2005-04-09
            /// 邮箱: outrace@soueast-motor.com
            /// 修改:
            /// </summary>
            public class MdlDataManage
            {
            #region 私有成员
            private string strID = null;
            private string strName = null;
            private string strSex = null;
            private string strEmail = "no email";
            private string strPage = "no page";
            private string strQQ = "no QQ";
            private string strSubject = null;
            private string strContent = null;
            private string strReply = "no reply";
            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();
            }
            }
            }
            }