ASP.NET读取XML某节点返回DataTable实例

 

网上有好多ASP.NET读取XML的例子,比如使用Dataset来读取,但本文教程却是使用XmlDocument来读取XML节点下所有数据,我们先来看下这个XML格式:SysRightsDb.xml

 XML Code [http://www.xueit.com]
   
     
<? 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;

 xmlHepler Code [http://www.xueit.com]
   
     
/// <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 Code [http://www.xueit.com]
   
     
protected 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节点数据了,最后看下效果图:

ASP.NET读取XML某节点返回DataTable实例

你可能感兴趣的:(Datatable)