【转】C#对XML操作:一个处理XML文件的类

it2022-05-09  31

本文转自: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();    }   }  } }

 

转载于:https://www.cnblogs.com/feima-lxl/archive/2008/06/26/1230781.html


最新回复(0)