asp.net把XML转为DataTable后怎么读它各个节点的值(速度答案对马上结贴)
asp.net把XML转为DataTable后怎么读它各个节点的值 --------------------编程问答-------------------- DataTable dt = new DataTable();dt.Rows[0][0] 第一行第一列
dt.Rows[0]["列名"] 第一行指定列名列 --------------------编程问答-------------------- --------------------编程问答-------------------- / --------------------编程问答-------------------- <?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。
这个类的源码关键的地方都写了注释,很简单。
下面我们来看下如何调用这个类。
文章来自学IT网:http://www.xueit.com/html/2009-12-15/21-97718778265.html --------------------编程问答-------------------- Datetable 都有了还不能取值? --------------------编程问答-------------------- 使用索引号就可以读取了嘛 --------------------编程问答-------------------- 好像只能通过循环吧,我现在也在做这个,没想到更好的。 --------------------编程问答-------------------- 没深入研究过、 友情 dingding、 --------------------编程问答-------------------- 这是读写的全部代码。 是我早期写 肯定能通过测试 你参考下吧
protected void btnSubmit_Click(object sender, System.EventArgs e)
{
DataSet ds = new DataSet("myDs");
if(!File.Exists(Server.MapPath("dbXML.xml")))
{
//以下创建数据库xml
DataTable dt = new DataTable("Question");
dt.Columns.Add("QuestionID",typeof(int));
dt.Columns.Add("Name",typeof(string));
dt.Columns.Add("Age",typeof(int));
dt.Columns.Add("Email",typeof(string));
dt.Columns.Add("Item",typeof(string));
ds.Tables.Add(dt);
//ds.WriteXml(Server.MapPath("dbQuestion.xml"));
}
else
ds.ReadXml(Server.MapPath("dbXML.xml"));
//以下生成一条记录
DataRow dr = ds.Tables[0].NewRow();
dr["QuestionID"] = ds.Tables[0].Rows.Count+1;
dr["Name"] =tbName.Text.Trim();
dr["Age"] = tbAge.Text;
dr["Email"] = tbEmail.Text;
//以下保存用户的调查项目
DataSet dsItem = new DataSet("Item");
DataTable dtItem = new DataTable("dtItem");
dsItem.Tables.Add(dtItem);
dtItem.Columns.Add("ID", typeof(int));
dtItem.Columns.Add("Title", typeof(string));
dtItem.Columns.Add("Answer", typeof(string));
for (int i = 1; i <= 6; i++)
{
DataRow drItem = dtItem.NewRow();
drItem["ID"] = i;
drItem["Title"] = ((Label)this.FindControl("lbQuestion" + i.ToString())).Text;
RadioButtonList rbl = (RadioButtonList)this.FindControl("rbQuestion" + i.ToString());
for (int j = 0; j < 4; j++)
{
if (rbl.Items[j].Selected)
drItem["Answer"] = rbl.Items[j].Text;
}
dtItem.Rows.Add(drItem);
}
dr["Item"] = dsItem.GetXml();
ds.Tables[0].Rows.Add(dr); --------------------编程问答-------------------- 再有问题 给我信息 --------------------编程问答-------------------- --------------------编程问答-------------------- 好东西..我正需要..哈哈..今天办事如此顺利!蓝色心情!
Blue!
补充:.NET技术 , ASP.NET