C#對XML操作:一個處理XML檔案的類(1)

來源:互聯網
上載者:User
C#操作XML初步(7)
第四章:通用的XML處理方法(1)
既然我們能夠使用DATASET來操作XML檔案,那真實太方便了,他完全有能力將一個XML檔案當作一張表來使用,那又何樂而不為呢?
於是我們可以同過這樣的一個C#類來操作XML,完成類似資料庫般的操作: using System;<br />using System.Text;<br />using System.IO;<br />using System.Xml;<br />using System.Data;</p><p>namespace XmlBook.Com.Sem.Tools<br />{<br />/// <summary><br />/// 著作權: Copyright by SEM IT Department<br />/// 版本: 0.0.1<br />/// 檔案: XmlBook.Com.Sem.Tools.XmlDataBase.cs<br />/// 目的: 提供將XML當作資料庫處理的一些方法<br />/// 作者: 歐陽雲天 @2005-04-09<br />/// 郵箱: outrace@soueast-motor.com<br />/// 修改:<br />/// </summary><br />public class XmlDataBase<br />{<br />#region 私人成員</p><p>private string strDataFile = null;<br />/// <summary><br />/// 資料集<br />/// </summary><br />private DataSet myDs = null;<br />/// <summary><br />/// 字元過濾數組 比如 "id='1' and userName='trace'"<br />/// </summary><br />private string strFilter = null;<br />/// <summary><br />/// 排序的欄位 比如 "id desc,userName"<br />/// </summary><br />private string strSort = null;<br />/// <summary><br />/// 資料集合中的欄位名集合<br />/// </summary><br />private string[] strFields = null;<br />/// <summary><br />/// 資料集合中的資料數組<br />/// </summary><br />private string[] strData = null;<br />/// <summary><br />/// 模板檔案的全路徑<br />/// </summary><br />private string strTemplateFile = null;<br />#endregion</p><p>#region 公用屬性<br />/// <summary><br />/// 模板檔案路徑<br />/// </summary><br />public string StrTemplateFile<br />{<br />set{this.strTemplateFile = value;}<br />get{return this.strTemplateFile;}<br />}<br />/// <summary><br />/// 資料檔案路徑<br />/// </summary><br />public string StrDataFile<br />{<br />set{this.strDataFile = value;}<br />get{return this.strDataFile;}<br />}<br />/// <summary><br />/// 字元過濾數組<br />/// </summary><br />public string StrFilter<br />{<br />set{this.strFilter = value;}<br />}<br />/// <summary><br />/// 排序的欄位<br />/// </summary><br />public string StrSort<br />{<br />set{this.strSort = value;}<br />}<br />/// <summary><br />/// 資料集合中的欄位名<br />/// </summary><br />public string[] StrFields<br />{<br />set{this.strFields = value;}<br />}<br />/// <summary><br />/// 資料集合中的資料數組<br />/// </summary><br />public string[] StrData<br />{<br />set{this.strData = value;}<br />}<br />/// <summary><br />/// 資料集合,可以放在緩衝供調用<br />/// </summary><br />public DataSet MyDs<br />{<br />set{this.myDs = value;}<br />get{return this.myDs;}<br />}<br />#endregion</p><p>public XmlDataBase()<br />{<br />//<br />// TODO: 提供將XML當作資料庫處理的一些方法<br />//<br />}</p><p>/// <summary><br />/// 取得XML檔案的內容並填入DataSet<br />/// </summary><br />private void Open()<br />{<br />try<br />{<br />this.myDs = new DataSet();<br />FileStream fin ;<br />fin = new FileStream(this.strDataFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);<br />this.myDs.ReadXml(fin);<br />fin.Close();<br />}<br />catch(Exception ee)<br />{<br />Log log = new Log();<br />log.StrUser = "系統";<br />log.StrDepartment = "讀取XML資料";<br />log.StrFileName = "Com.Sem.Tools.XmlDataBase";<br />log.StrDescription = ee.Message;<br />log.WriteLog();<br />}<br />}</p><p>/// <summary><br />/// 將操作結果寫入XML<br />/// </summary><br />private void Save()<br />{<br />try<br />{<br />this.myDs.WriteXml(this.strDataFile, XmlWriteMode.WriteSchema);<br />}<br />catch(Exception ee)<br />{<br />Log log = new Log();<br />log.StrUser = "系統";<br />log.StrDepartment = "儲存XML資料";<br />log.StrFileName = "Com.Sem.Tools.XmlDataBase";<br />log.StrDescription = ee.Message;<br />log.WriteLog();<br />}<br />}</p><p>/// <summary><br />/// 取得特定的資料檢視<br />/// 一般在資料繫結的時候,我們可以很方便的產生供綁定的視圖<br />/// </summary><br />/// <returns>資料檢視</returns><br />public DataView SelectView()<br />{<br />if(this.myDs == null) this.Open();</p><p>DataView myDv = new DataView(this.myDs.Tables[0]);</p><p>if (strFilter != null) myDv.RowFilter = this.strFilter;</p><p>myDv.Sort = this.strSort;</p><p>return myDv;<br />}</p><p>/// <summary><br />/// 取得特定的行<br />/// 使用行的方式是因為有些時候,我們僅僅只需要某一行或多行記錄<br />/// 比如我們判斷登陸的時候,只是需要某個ID的所在行,然後匹配它的密碼項<br />/// </summary><br />/// <returns>各行資料</returns><br />public DataRow[] SelectRows()<br />{<br />if(this.myDs == null) this.Open();<br />DataRow[] myRows = myDs.Tables[0].Select(this.strFilter);<br />return myRows;<br />}</p><p>/// <summary><br />/// 往XML當中插入一條資料<br />/// </summary><br />/// <returns>操作是否成功</returns><br />public bool Insert()<br />{<br />if(this.myDs == null) this.Open();</p><p>try<br />{<br />DataRow newRow = myDs.Tables[0].NewRow();</p><p>for (int i = 0; i < this.strFields.Length; i++)<br />{<br />newRow[this.strFields[i]] = this.strData[i];<br />}</p><p>myDs.Tables[0].Rows.Add(newRow);<br />this.Save();<br />return true;<br />}<br />catch(Exception ee)<br />{<br />Log log = new Log();<br />log.StrUser = "系統";<br />log.StrDepartment = "寫入XML資料";<br />log.StrFileName = "Com.Sem.Tools.XmlDataBase";<br />log.StrDescription = ee.Message;<br />log.WriteLog();<br />return false;<br />}<br />}</p><p>/// <summary><br />/// 更新資料,這個時候要確保strFields 與 strData 兩個數組的維數一致<br />/// </summary><br />/// <returns>是否更新成功</returns><br />public bool Update()<br />{<br />if(this.myDs == null) this.Open();</p><p>try<br />{<br />DataRow[] editRow = myDs.Tables[0].Select(this.strFilter);</p><p>for(int j=0; j< editRow.Length; j++)<br />{<br /> for (int i = 0; i < this.strFields.Length; i++)<br /> {<br />editRow[j][this.strFields[i]] = this.strData[i];<br /> }<br />}<br /> this.Save();<br />return true;<br />}<br />catch(Exception ee)<br />{<br />Log log = new Log();<br />log.StrUser = "系統";<br />log.StrDepartment = "更新XML資料";<br />log.StrFileName = "Com.Sem.Tools.XmlDataBase";<br />log.StrDescription = ee.Message;<br />log.WriteLog();<br />return false;<br />}<br />}</p><p>/// <summary><br />/// 刪除資料<br />/// </summary><br />/// <returns>是否刪除成功</returns><br />public bool Delete()<br />{<br />if(this.myDs == null) this.Open();</p><p>try<br />{<br />DataRow[] editRow = myDs.Tables[0].Select(this.strFilter);<br />for(int i=0;i<editRow.Length;i++)<br />{<br />editRow[i].Delete();<br />}<br />this.Save();<br />return true;<br />}<br />catch(Exception ee)<br />{<br />Log log = new Log();<br />log.StrUser = "系統";<br />log.StrDepartment = "刪除XML資料";<br />log.StrFileName = "Com.Sem.Tools.XmlDataBase";<br />log.StrDescription = ee.Message;<br />log.WriteLog();<br />return false;<br />}<br />}</p><p>/// <summary><br />/// 根據一個模板,建立一個XML檔案(前提是必須有一個模板檔案、並確定目標檔案路徑)<br />/// </summary><br />/// <returns>寫入是否成功</returns><br />public bool Create()<br />{<br />try<br />{<br />XmlDocument doc = new XmlDocument();<br />XmlTextReader reader = new XmlTextReader(this.strTemplateFile);<br />doc.Load(reader);<br />XmlElement member;<br />XmlNode root = doc.DocumentElement;</p><p>for (int i = 0; i < this.strFields.Length; i++)<br />{<br />member = doc.CreateElement(strFields[i].ToString());<br />member.InnerText = this.strData[i].ToString();<br />root.AppendChild(member);<br />}</p><p>XmlTextWriter xmlWriter = new XmlTextWriter(this.strDataFile,null);<br />xmlWriter.Formatting = Formatting.Indented;<br />doc.Save(xmlWriter);</p><p>xmlWriter.Close();<br />reader.Close();<br />return true;<br />}<br />catch(Exception ee)<br />{<br />Log log = new Log();<br />log.StrUser = "系統";<br />log.StrDepartment = "建立XML資料";<br />log.StrFileName = "Com.Sem.Tools.XmlDataBase";<br />log.StrDescription = ee.Message;<br />log.WriteLog();<br />return false;<br />}<br />}</p><p>/// <summary><br />/// 釋放資源<br />/// </summary><br />public void Clear()<br />{<br />if (this.myDs != null)<br />{<br />this.myDs.Dispose();<br />}<br />}<br />}<br />}<br />
類中引入了另外一個LOG處理的類,在這裡一併發給大家
using System;<br />using System.Xml;<br />using System.Web;</p><p>namespace XmlBook.Com.Sem.Tools<br />{<br />/// <summary><br />/// 著作權: Copyright by SEM IT Department<br />/// 版本: 0.0.1<br />/// 檔案: XmlBook.Com.Sem.Tools.Log.cs<br />/// 目的: 提供一個寫LOG的方法(就是將錯誤寫入XML記錄當中)<br />/// 作者: 歐遠寧 @2005-04-09<br />/// 郵箱: outrace@soueast-motor.com<br />/// 修改:<br />/// </summary><br />public class Log<br />{<br />#region 私人成員<br />private HttpContext objContext = HttpContext.Current;<br />/// <summary><br />/// 記錄檔路徑<br />/// </summary><br />private string logFile = null;<br />/// <summary><br />/// 操作人員<br />/// </summary><br />private string strUser = null;<br />/// <summary><br />/// 所屬版塊<br />/// </summary><br />private string strDepartment = null;<br />/// <summary><br />/// 正在操作的檔案名稱<br />/// </summary><br />private string strFileName = null;<br />/// <summary><br />/// 操作時間<br />/// </summary><br />private string strTime = null;<br />/// <summary><br />/// 錯誤描述<br />/// </summary><br />private string strDescription = null;<br />#endregion</p><p>#region 公用屬性<br />/// <summary><br />/// 操作人員<br />/// </summary><br />public string StrUser<br />{<br />get{return this.strUser;}<br />set{this.strUser = value;}<br />}<br />/// <summary><br />/// 正在操作的檔案名稱<br />/// </summary><br />public string StrFileName<br />{<br />get{return this.strFileName;}<br />set{this.strFileName = value;}<br />}<br />/// <summary><br />/// 所屬版塊<br />/// </summary><br />public string StrDepartment<br />{<br />get{return this.strDepartment;}<br />set{this .strDepartment = value;}<br />}<br />/// <summary><br />/// 操作時間<br />/// </summary><br />public string StrTime<br />{<br />get{return this.strTime;}<br />set{this.strTime = value;}<br />}<br />/// <summary><br />/// 錯誤描述<br />/// </summary><br />public string StrDescription<br />{<br />get{return this.strDescription;}<br />set{this.strDescription = value;}<br />}<br />#endregion</p><p>public Log()<br />{<br />//<br />// TODO: 提供一個寫LOG的方法(就是將錯誤寫入XML記錄當中)<br />//<br />}</p><p>/// <summary><br />/// 將內容寫入記錄檔<br />/// </summary><br />public void WriteLog()<br />{<br />this.logFile = this.objContext.Server.MapPath("./Log/log.config");<br />try<br />{<br />XmlDocument doc = new XmlDocument();<br />doc.Load(this.logFile);<br />XmlElement newLog = doc.CreateElement("Log");</p><p>XmlElement newUser = doc.CreateElement("User");<br />newUser.InnerText = this.strUser;<br />newLog.AppendChild(newUser);</p><p>XmlElement newDepartment = doc.CreateElement("Department");<br />newDepartment.InnerText = this.strDepartment;<br />newLog.AppendChild(newDepartment);</p><p>XmlElement newFileName = doc.CreateElement("FileName");<br />newFileName.InnerText = this.StrFileName;<br />newLog.AppendChild(newFileName);</p><p>XmlElement newTime = doc.CreateElement("Time");<br />newTime.InnerText = DateTime.Now.ToString();<br />newLog.AppendChild(newTime);</p><p>XmlElement newDescription = doc.CreateElement("Description");<br />newDescription.InnerText = this.strDescription;<br />newLog.AppendChild(newDescription);</p><p>doc.DocumentElement.AppendChild(newLog);<br />doc.Save(this.logFile);<br />}<br />catch(Exception ex)<br />{<br />HttpContext objContext = HttpContext.Current;<br />objContext.Response.Write(ex.Message);<br />}<br />finally<br />{<br />}<br />}<br />}<br />}<br />
這樣我們就可以非常方便的將一個XML檔案當作是一張表來操作了 使用的例子,我將在下一篇給出

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.