網上有好多ASP.NET讀取XML的例子,比如使用Dataset來讀取,但本文教程卻是使用XmlDocument來讀取XML節點下所有數據,我們先來看下這個XML格式:SysRightsDb.xml
XML Code<?xml version="1.0" encoding="utf-8" ?> <root> <rights name="SYS"> <xml name="股票行情" code="stockmarket"></xml> <xml name="業務系統" code="sales"></xml> <xml name="客服系統" code="servcice"></xml> <xml name="財務系統" code="financial"></xml> <xml name="呼叫中心系統" code="callcenter"></xml> <xml name="報表系統" code="report"></xml> </rights> <rights name="financial"> <xml name="訂單管理" code="so_mana"></xml> <xml name="訂單列表" code="so_list"></xml> <xml name="申請審計" code="so_audit_list"></xml> <xml name="權限列表" code="so_ur_sour_list"></xml> </rights> </root>
從這個XML可以看下,我將使用ASP.NET讀取權限系統中節點屬性等於SYS下所有數據,及讀取financial節點下所有數據。
這種XML數據格式讓人看起來很明確就知道所代表的意思,看起來也不錯。
下面開始吧。
第1、首先創建讀取XML類xmlHepler,內容如下:
先引用兩個命名空間
using System.Xml;
using System.Collections;
/// <summary> /// 作者:dodo /// 網站:www.xueit.com /// /// 讀取XML類 /// </summary> /// <typeparam name="T"></typeparam> public class xmlHepler<T>:System.Web.UI.Page { Hashtable table = new Hashtable(); T FileName; T Root; //根節點 T RootAttName; //節點屬性名稱 T RootAttValue; //根節點屬性值 T Field; //Xml字段 /// <summary> /// XML文件路徑 /// </summary> /// <param name="val"></param> public xmlHepler(T val) { FileName = val; this.LoadXml(val.ToString()); } /// <summary> /// XML文件路徑 /// </summary> /// <param name="file"></param> private void LoadXml(string file) { XmlDocument xdoc = new XmlDocument(); xdoc.Load(file); table.Add("xml", xdoc); } /// <summary> /// 返回XML to DataTable /// </summary> /// <returns></returns> public DataTable GetXmlToDataTable() { string[] SplitField=Field.ToString().Split(','); //構造DataTable DataTable dt = new DataTable(); DataColumn dc = null; for (int i = 0; i < SplitField.Length; i ) { dc = new DataColumn(SplitField[i]); dt.Columns.Add(dc); } XmlDocument xdoc = (XmlDocument)table["xml"]; XmlNodeList xTable = xdoc.DocumentElement.SelectNodes(Root.ToString()); foreach (XmlNode xnode in xTable) { if (xnode.Attributes[RootAttName.ToString()].InnerText == RootAttValue.ToString()) //某一節點 { //該節點下所有子節點 XmlNodeList xnlist = xnode.ChildNodes; //子節點所有數據 for (int i = 0; i < xnlist.Count; i ) //for (int i = 0; i < xnode.ChildNodes.Count; i ) 這句是所有xml子節點數據 { DataRow dr = dt.NewRow(); //綁定所需字段 for (int j = 0; j < SplitField.Length; j ) { dr[SplitField[j]] = xnode.ChildNodes[i].Attributes[SplitField[j]].Value; } dt.Rows.Add(dr); } } } return dt; } #region 設置值 /// <summary> /// 根節點 /// </summary> public T xmlRoot { get { return Root; } set { Root = value; } } /// <summary> /// 節點屬性字段名稱 /// </summary> public T xmlRootAttName { get { return RootAttName; } set { RootAttName = value; } } /// <summary> /// 節點屬性字段值 /// </summary> public T xmlRootAttValue { get { return RootAttValue; } set { RootAttValue = value; } } /// <summary> /// 子節點屬性字段 /// </summary> public T xmlSplitField { set { Field = value; } } #endregion }
這個xmlHepler類使用DocumentElement.SelectNodes來選擇XML節點,之後if (xnode.Attributes[RootAttName.ToString()].InnerText == RootAttValue.ToString())獲取相關屬性的節點.
使用方法GetXmlToDataTable()來構造DataTable,把XML節點下所有數據導入到DataTable。
這個類的源碼關鍵的地方都寫了注釋,很簡單。
下面我們來看看如何調用此類:
在程序Page_Load測試調用SysRightsDb.xml,並把相關數據顯示出來。
源碼如下:
調用xmlHepler Codeprotected void Page_Load(object sender, EventArgs e) { xmlHepler<string> xml = new xmlHepler<string>(Server.MapPath("SysRightsDb.xml")); xml.xmlRoot = "rights"; // 調用SYS節點下數據 xml.xmlRootAttName = "name"; xml.xmlRootAttValue = "SYS"; xml.xmlSplitField = "code,name"; DataTable dt = xml.GetXmlToDataTable(); Response.Write("<b>系統權限</b><br>"); foreach (DataRow dr in dt.Rows) { Response.Write("name:" dr["name"].ToString() " code:" dr["code"].ToString()); Response.Write("<br>"); } // 調用financial節點下數據 xml.xmlRootAttName = "name"; xml.xmlRootAttValue = "financial"; xml.xmlSplitField = "code,name"; dt = xml.GetXmlToDataTable(); Utils.Response("<b>子系統權限</b><br>"); foreach (DataRow dr in dt.Rows) { Response.Write("name:" dr["name"].ToString() " code:" dr["code"].ToString()); Response.Write("<br>"); } }
嗯,到現在為此,很簡單就可以實現調用XML節點數據了,最後看下效果圖:
教程比較短,多多交流!