網上有好多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節點數據了,最後看下效果圖:

教程比較短,多多交流!