1 基本思路
其實用DataSet操作XML,歸根到底就是對DataSet裡的表格,行,列等進行操作,然後用DataSet裡的東西重新寫到XML中,從而實現編輯XML的目的。如果再配合上.xsd文件的話,那效果更佳。
2 程序詳解
(1) XML文件內容
本類操作的XML和生成的XML格式是一樣的,如下(點擊查看代碼1附件):(如出現中文亂碼,請在浏覽器查看選項的編碼中選擇"簡體中文")
然後點擊XML文件右下角的“數據”,即可看到熟悉的表格形式,在表格的任意位置上單擊右鍵選擇“創建架構”,將會生成一個.xsd文件,該文件用來定義XML各列的類型。其內容如下(點擊查看代碼2附件):
注意:如果想像數據庫一樣有一個自動增長的ID字段,則可以這樣操作:
首先在XML中添加一個
以上代碼如果看不懂並不要緊,因為我們可以通過DataSet來生成這種格式的內容。接下來將開始操作XML。
(2) 處理XML文件路徑
這裡主要是對傳入的XML路徑進行處理,如果傳入的是相對路徑,則返回完整路徑,如果傳入的是完整路徑,則不做處理直接返回。方法如下:
#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
(3) 讀取記錄
讀取XML的數據到DataSet中的方法為:
#region GetDataSetByXML
/// <summary>
/// 讀取XML直接返回DataSet
/// </summary>
/// <param name="strXmlPath">XML文件相對路徑</param>
/// <returns></returns>
public static DataSet GetDataSetByXml(string strXMLPath)
{
try
{
DataSet ds = new DataSet();
//讀取XML到DataSet
ds.ReadXml(GetXmlFullPath(strXMLPath));
if(ds.Tables.Count > 0)
{
return ds;
}
return null;
}
catch(Exception)
{
return null;
}
}
#endregion
以上方法將得到一個DataSet,裡面保存的是全部XML記錄的信息,而且沒有經過任何處理。但很多時候我們需要的只是一些滿足條件的記錄,這時需要用以下方法得到:(點擊查看代碼3附件)
(4) 插入記錄
到現在為止我們已經可以隨意讀取XML中的記錄,接下來來實現寫入XML的操作,方法如下:(點擊查看代碼4附件)
可能有的朋友不知道怎麼用這個方法插入數據,在後面我將用實例介紹。
(5) 修改記錄
修改記錄的方法要傳入的參數相對較多,因為修改記錄需要先定位到具體哪一條記錄,再修改指定列的值,以下為修改XML的方法:(點擊查看代碼5附件)
(6) 刪除記錄
為了方便,刪除記錄提供了三個方法,一個可以刪除所有記錄,一個刪除符合條件的行,還有一個刪除指定Index值的行,該Index值和記錄在Data
Set中的Index值對應。刪除所有記錄的方法為:(點擊查看代碼6附件)
這裡說一下提供此方法的原因,有的時候將XML的內容讀到DataSet,然後綁定到DataGrid後,由於DataGrid中只有一個模板列,而模板列裡又套了表格等許多控件,這就使得我們可能無法得到記錄對應的ID值,這個時候就可以先得到記錄的Index值(第一行為0,第二行為1,以此類推),然後將該Index值傳到方法中,就可以將該記錄刪掉。
注意:使用該方法的時候,綁定到DataGrid上的DataSet和刪除時用的DataSet要為同一個,也就是說Index要相同,不能有排序,不然會誤將記錄。
有時候我們需要刪除符合條件的多行,這個時候可以用以下方法實現:(點擊查看代碼7附件)
3 實例解析
(7) 讀取XML
以下代碼讀取到一個沒有排序和篩選的DataSet。
DataGrid1.DataSource = OperateXmlByDataSet.GetDataSetByXml(@"xml/xml_xmlDB.XML");
DataGrid1.DataBind();
以下代碼讀到的數據是經過篩選和排序的:
DataGrid1.DataSource = OperateXmlByDataSet.GetDataVIEwByXML(
@"xml/xml_xmlDB.xml", //XML文件路徑
"name = 'Asp.Net'", //條件:name列值為ASP.Net
"peopleNum desc"); //按peopleNum列降序排列
DataGrid1.DataBind();
(8) 添加記錄
以下代碼向XML文件中添加了一條記錄,同時給7個列賦值:
bool b;
b = OperateXmlByDataSet.WriteXMLByDataSet(
@"xml/xml_xmlDB.xml", //XML文件地址
new string[]{
"name", //姓名字段
"peopleNum", //人數字段
"address", //地址字段
"description", //描述字段
"require", //需求字段
"deadLine", //結束時間字段
"IsMarrIEd" //婚否字段
},
new string[]{
"ASP.Net程序員", //姓名字段值
"2", //人數字段值
"建國路", //地址字段值
"B/S結構程序", //描述字段值
"ASP.Net c#等", //需求字段值
DateTime.Now.ToShortDateString(), //結束時間字段值
"false" //婚否字段值
});
如果b返回值為true,表示添加成功,否則表示添加失敗。以上的寫法我用了些偷懶的方法,比如我把數組直接放在參數,而沒有另外申明,事實上你可以另外申明一個數組,然後再傳到方法中。
請注意字段在數組中的位置和值在數組中的位置的對應關系。
(9) 修改記錄
以下代碼將找到peopleNum列值為3的行,然後將行的name、peopleNum、、description和IsMarrIEd四個字段的值分別更新成kgdiwss、10、描述、true。
bool b;
b = OperateXmlByDataSet.UpdateXMLRow(
@"xml/xml_xmlDB.XML",
new string[]{"name","peopleNum","description","IsMarrIEd"},
new string[]{"kgdiwss","10","描述","true"},
"peopleNum",
"3");
返回true表示修改成功,否則表示修改失敗。
請特別注意,字段類型為邏輯型時,賦值用的是true和false,而不是0和1。
(10) 刪除記錄
以下代碼實現刪除name列值為數組中的值的行。
bool b;
b = OperateXmlByDataSet.DeleteXMLRows(
@"xml/xml_xmlDB.xml", //XML文件路徑
"name", //條件列
new string[]{
"值1", //條件值1
"值2", //條件值2
"值3" //條件值3
});
上面代碼執行成功後,name列值為值1、值2、值3的行將被刪除。
刪除成功返回true,否則返回false。
另外兩種刪除的方法用法比較簡單,這裡就不介紹了。
以上就是操作XML的所有方法,相信可以滿足很大一部份的使用了。然而,如果XML中的數據量比較大的話,使用以上方法效率可能不高,但話又說回來,如果數據量比較大的話,還是選擇數據庫比較好。