ASP.NET读取XML某节点所有数据返回DataTable的实例

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

<?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;

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,并把相关数据显示出来。

源码如下:

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节点数据了,最后看下效果图:

教程比较短,多多交流!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值