一個通過DataSet操作XML的類

來源:互聯網
上載者:User

using System;
using System.Data;
using System.Xml;

//***************************************
// 作者: ∮明天去要飯
// QICQ: 305725744
// .Net群: 6370988
// http://blog.csdn.net/kgdiwss
//***************************************

namespace DataSet2Xml.Component
{
/// <summary>
/// OperateXmlByDataSet 的摘要說明。
/// </summary>
public class OperateXmlByDataSet
{
   public OperateXmlByDataSet()
   {
    //
    // TODO: 在此處添加建構函式邏輯
    //
   }
  
   #region GetDataSetByXml
   /// <summary>
   /// 讀取xml直接返回DataSet
   /// </summary>
   /// <param name="strXmlPath">xml檔案相對路徑</param>
   /// <returns></returns>
   public static DataSet GetDataSetByXml(string strXmlPath)
   {
    try
    {
     DataSet ds = new DataSet();
     ds.ReadXml(GetXmlFullPath(strXmlPath));
     if(ds.Tables.Count > 0)
     {
      return ds;
     }
     return null;
    }
    catch(Exception)
    {
     return null;
    }
   }
   #endregion

   #region GetDataViewByXml
   /// <summary>
   /// 讀取Xml返回一個經排序或篩選後的DataView
   /// </summary>
   /// <param name="strXmlPath"></param>
   /// <param name="strWhere">篩選條件,如:"name = 'kgdiwss'"</param>
   /// <param name="strSort">排序條件,如:"Id desc"</param>
   /// <returns></returns>
   public static DataView GetDataViewByXml(string strXmlPath,string strWhere,string strSort)
   {
    try
    {
     DataSet ds = new DataSet();   
     ds.ReadXml(GetXmlFullPath(strXmlPath));   
     DataView dv = new DataView(ds.Tables[0]);
     if(strSort != null)
     {
      dv.Sort = strSort;
     }
     if(strWhere != null)
     {
      dv.RowFilter = strWhere;   
     }
     return dv;
    }
    catch(Exception)
    {
     return null;
    }
   }
   #endregion

   #region WriteXmlByDataSet
   /// <summary>
   /// 向Xml檔案插入一行資料
   /// </summary>
   /// <param name="strXmlPath">xml檔案相對路徑</param>
   /// <param name="Columns">要插入行的列名數組,如:string[] Columns = {"name","IsMarried"};</param>
   /// <param name="ColumnValue">要插入行每列的值數組,如:string[] ColumnValue={"明天去要飯","false"};</param>
   /// <returns>成功返回true,否則返回false</returns>
   public static bool WriteXmlByDataSet(string strXmlPath,string[] Columns,string[] ColumnValue)
   {
    try
    {     
     //根據傳入的XML路徑得到.XSD的路徑,兩個檔案放在同一個目錄下
     string strXsdPath = strXmlPath.Substring(0,strXmlPath.IndexOf(".")) + ".xsd";
    
     DataSet ds = new DataSet();
     //讀xml架構,關係到列的資料類型
     ds.ReadXmlSchema(GetXmlFullPath(strXsdPath));
     ds.ReadXml(GetXmlFullPath(strXmlPath));
     DataTable dt = ds.Tables[0];
     //在原來的表格基礎上建立新行
     DataRow newRow = dt.NewRow();

     //迴圈給一行中的各個列賦值
     for(int i=0; i< Columns.Length; i++)
     {
      newRow[Columns[i]] = ColumnValue[i];
     }
     dt.Rows.Add(newRow);
     dt.AcceptChanges();
     ds.AcceptChanges();

     ds.WriteXml(GetXmlFullPath(strXmlPath));
     return true;
    }
    catch(Exception)
    {
     return false;
    }
   }
   #endregion  

   #region UpdateXmlRow
   /// <summary>
   /// 更行合格一條Xml記錄
   /// </summary>
   /// <param name="strXmlPath">XML檔案路徑</param>
   /// <param name="Columns">列名數組</param>
   /// <param name="ColumnValue">列值數組</param>
   /// <param name="strWhereColumnName">條件列名</param>
   /// <param name="strWhereColumnValue">條件列值</param>
   /// <returns></returns>
   public static bool UpdateXmlRow(string strXmlPath,string[] Columns,string[] ColumnValue,string strWhereColumnName,string strWhereColumnValue)
   {
    try
    {       
     string strXsdPath = strXmlPath.Substring(0,strXmlPath.IndexOf(".")) + ".xsd";
    
     DataSet ds = new DataSet();
     //讀xml架構,關係到列的資料類型
     ds.ReadXmlSchema(GetXmlFullPath(strXsdPath));
     ds.ReadXml(GetXmlFullPath(strXmlPath));

     //先判斷行數
     if(ds.Tables[0].Rows.Count > 0)
     {     
      for(int i=0; i< ds.Tables[0].Rows.Count; i++)
      {
       //如果目前記錄為符合Where條件的記錄
       if(ds.Tables[0].Rows[i][strWhereColumnName].ToString().Trim().Equals(strWhereColumnValue))
       {
        //迴圈給找到行的各列賦新值
        for(int j=0; j < Columns.Length; j++)
        {               
         ds.Tables[0].Rows[i][Columns[j]] = ColumnValue[j];        
        }
        //更新DataSet
        ds.AcceptChanges();
        //重新寫入XML檔案
        ds.WriteXml(GetXmlFullPath(strXmlPath));
        return true;
       }
      }     
     
     }     
     return false;
    }
    catch(Exception)
    {
     return false;
    }
   }
   #endregion  

   #region DeleteXmlRowByIndex
   /// <summary>
   /// 通過刪除DataSet中iDeleteRow這一行,然後重寫Xml以實現刪除指定行
   /// </summary>
   /// <param name="strXmlPath"></param>
   /// <param name="iDeleteRow">要刪除的行在DataSet中的Index值</param>
   public static bool DeleteXmlRowByIndex(string strXmlPath,int iDeleteRow)
   {
    try
    {
     DataSet ds = new DataSet();
     ds.ReadXml(GetXmlFullPath(strXmlPath));
     if(ds.Tables[0].Rows.Count > 0)
     {
      //刪除符號條件的行
      ds.Tables[0].Rows[iDeleteRow].Delete();
     }
     ds.WriteXml(GetXmlFullPath(strXmlPath));
     return true;
    }
    catch(Exception)
    {
     return false;
    }   
   }
   #endregion

   #region DeleteXmlRows
   /// <summary>
   /// 刪除strColumn列中值為ColumnValue的行
   /// </summary>
   /// <param name="strXmlPath">xml相對路徑</param>
   /// <param name="strColumn">列名</param>
   /// <param name="ColumnValue">strColumn列中值為ColumnValue的行均會被刪除</param>
   /// <returns></returns>
   public static bool DeleteXmlRows(string strXmlPath,string strColumn,string[] ColumnValue)
   {
    try
    {
     DataSet ds = new DataSet();
     ds.ReadXml(GetXmlFullPath(strXmlPath));

     //先判斷行數
     if(ds.Tables[0].Rows.Count > 0)
     {
      //判斷行多還是刪除的值多,多的for迴圈放在裡面
      if(ColumnValue.Length > ds.Tables[0].Rows.Count)
      {
       for(int i=0; i < ds.Tables[0].Rows.Count; i++)
       {       
        for(int j=0; j < ColumnValue.Length; j++)
        {      
         if(ds.Tables[0].Rows[i][strColumn].ToString().Trim().Equals(ColumnValue[j]))
         {
          ds.Tables[0].Rows[i].Delete();
         }
        }
       }
      }
      else
      {
       for(int j=0; j < ColumnValue.Length; j++)
       {       
        for(int i=0; i < ds.Tables[0].Rows.Count; i++)
        {         
         if(ds.Tables[0].Rows[i][strColumn].ToString().Trim().Equals(ColumnValue[j]))
         {
          ds.Tables[0].Rows[i].Delete();
         }
        }
       }      
      }  
      ds.WriteXml(GetXmlFullPath(strXmlPath));
     }    
     return true;  
    }
    catch(Exception)
    {
     return false;
    }   
   }
   #endregion
  
   #region DeleteXmlAllRows
   /// <summary>
   /// 刪除所有行
   /// </summary>
   /// <param name="strXmlPath">XML路徑</param>
   /// <returns></returns>
   public static bool DeleteXmlAllRows(string strXmlPath)
   {
    try
    {
     DataSet ds = new DataSet();
     ds.ReadXml(GetXmlFullPath(strXmlPath));
     //如果記錄條數大於0
     if(ds.Tables[0].Rows.Count > 0)
     {
      //移除所有記錄
      ds.Tables[0].Rows.Clear();
     }
     //重新寫入,這時XML檔案中就只剩根節點了
     ds.WriteXml(GetXmlFullPath(strXmlPath));    
     return true;
    }
    catch(Exception)
    {
     return false;
    }  
   }
   #endregion

   #region GetXmlFullPath
   /// <summary>
   /// 返回完整路徑
   /// </summary>
   /// <param name="strPath">Xml的路徑</param>
   /// <returns></returns>
   public static string GetXmlFullPath(string strPath)
   {  
    if(strPath.IndexOf(":") > 0)
    {
     return strPath;
    }
    else
    {
     return System.Web.HttpContext.Current.Server.MapPath(strPath);
    }
   }
   #endregion
}
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.