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
}
}