现在的位置: 首页 > 综合 > 正文

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

2012年04月19日 ⁄ 综合 ⁄ 共 13462字 ⁄ 字号 评论关闭

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

 

【上篇】
【下篇】

抱歉!评论已关闭.