使用XmlDocument读取XML节点所有数据

2025-11-10 07:00:03

1、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;

 

xmlHepler Code

 

/// <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。

 

这个类的源码关键的地方都写了注释,很简单。

 

2、下面我们来看看如何调用此类:

 

在程序Page_Load测试调用SysRightsDb.xml,并把相关数据显示出来。

 

源码如下:

 

调用xmlHepler Code

 

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>");

 

}

 

}

 

3、嗯,到现在为此,很简单就可以实现调用XML节点数据了,最后看下效果图:

 

使用XmlDocument读取XML节点所有数据

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢