.NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表
/// <summary>
/// 解析xml字符串 转换为实体类列表数据
/// </summary>
/// <param name="xmlStr">xml字符串</param>
/// <returns></returns>
/// xml字符串格式如下:(Item的节点客户有多对,每对代表一条数据)
/// <?xml version="1.0" encoding="utf-8" ?><BOSS><Item>
/// <UserId>用户编号</UserId>
/// <Type>用户类型</Type>
/// <Group>用户群</Group>
/// <State>用户状态</State>
/// <SIM>SIM卡号</SIM>
/// <STB>机顶盒号</STB>
/// <Memo>备注</Memo>
/// <Crtime>创建日期</Crtime>
/// <CustomerId>客户编号</CustomerId>
/// <CustomerName>客户名称</CustomerName>
/// <Address>用户地址</Address>
/// <Phone>电话</Phone>
/// <Mobile>手机</Mobile>
/// </Item><Code></Code><Msg></Msg></BOSS>
public List<UserInfo> GetUserList(string xmlStr)
{
System.Type t = typeof(UserInfo);
object obj = Activator.CreateInstance(t, null);//创建指定类型实例
PropertyInfo[] fields = obj.GetType().GetProperties();//获取指定对象的所有公共属性 List<UserInfo> ulist = new List<UserInfo>();
XmlDocument xml = new XmlDocument();
xml.LoadXml(xmlStr);//加载xml
XmlNodeList xlist = xml.GetElementsByTagName("Item");//获取Item节点列表
foreach (XmlNode xn in xlist)//遍历Item节点下的子节点
{ object u = Activator.CreateInstance(t, null);//创建指定类型实例 foreach (PropertyInfo p in fields)
{
for (int i = ; i < xn.ChildNodes.Count; )
{
if (xn.ChildNodes[i].Name == p.Name)
{
p.SetValue(u, xn.ChildNodes[i].InnerText, null);//给创建的实例属性赋值
}
i++;
}
}
ulist.Add((UserInfo)u);
}
return ulist;
}
或者将该方法写为一个通用的方法进行调用
/// <summary>
/// 获取一个实体类的object数据列表
/// </summary>
/// <param name="xmlStr">指定格式的xml字符串</param>
/// <param name="t">实体类的发射类对象</param>
/// <returns>实体类的object数据类别</returns>
/// 不可直接将数据类别转换为实体类的真正类型数据列表,转换时,需遍历没有object逐个转换为实体类型,然后附加到List
public List<object> GetObjectList(string xmlStr, Type t)
{
List<object> olist = new List<object>();
object obj = Activator.CreateInstance(t, null);//创建指定类型实例
PropertyInfo[] fields = obj.GetType().GetProperties();//获取指定对象的所有公共属性 XmlDocument xml = new XmlDocument();
xml.LoadXml(xmlStr);//加载xml
XmlNodeList xlist = xml.GetElementsByTagName("Item");//获取Item节点列表
foreach (XmlNode xn in xlist)//遍历Item节点下的子节点
{ object u = Activator.CreateInstance(t, null);//创建指定类型实例 foreach (PropertyInfo p in fields)
{
for (int i = ; i < xn.ChildNodes.Count; )
{
if (xn.ChildNodes[i].Name == p.Name)
{
p.SetValue(u, xn.ChildNodes[i].InnerText, null);//给创建的实例属性赋值
}
i++;
}
}
olist.Add(u);
}
return olist;
}
string xmlStr="指定格式的xml字符串";
System.Type t=typeof(实体类);
List<object> olist=GetObjectList(xmlStr,t);
List<实体类> list=new List<实体类>
然而此处存在一个问题,就是获取的只是object类的数据列表,并且List<object> 是无法转换为 List<实体类> 的,这时候我们可以通过遍历的形式进行转换
foreach(object o in olist)
{
list.Add((实体类)o);
}
.NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表的更多相关文章
- c# 利用反射动态给实体类对象赋值
转:http://blog.sina.com.cn/s/blog_659a572b0100xp5s.html 例子如下 using System; using System.Collections.G ...
- java解析xml字符串为实体(dom4j解析)
package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...
- tinyXml直接解析XML字符串
一直都用tinyxml直接LoadFile来解析XML,发现原来也可以直接解析XML字符串. XML文件: <?xml version=\"1.0\" encoding=\& ...
- 解析xml字符串时报“前言中不允许有内容”错误。
一,问题出现经过: j基于java语言webservic服务端接收客户端 传来的xml字符串用 解析时总报:org.dom4j.DocumentException: Error on line 1 o ...
- dom4j解析xml字符串实例
DOM4J 与利用DOM.SAX.JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异.功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml ...
- java解析xml字符串(用dom4j)
package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...
- C++解析XML字符串
项目交互遇到了需要VC++中解析XML字符串,故花了点时间了解了下VC++中解析XML的诸多方法主要包括三种:msxml(微软提供).markup.TinyXml. 开始花了点时间使用msxml3,虽 ...
- Android利用反射机制为实体类属性赋值
在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面 ...
- Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...
随机推荐
- 呈现样式UIModalPresentation
nModal n在iPhone开发中 pModal是一种常见的切换控制器的方式 p默认是从屏幕底部往上弹出,直到完全盖住后面的内容为止 n n在iPad开发中 pModal的使用频率也是非常高的 ...
- 【u204】高级砝码称重
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 现有n个砝码,重量分别为a1,a2,a3,--,an,在去掉m个砝码后,问最多能称量出多少不同的重量( ...
- webtool小问题
webtool小问题 erlang的观察工具如crashdump,appmon,cover等工具有二种不同的界面:gs(wx)和web.这些tool都遵循一定的接口,用户可以自行扩展这些功能,使的能够 ...
- 建立一个OTP应用
http://www.javaeye.com/topic/374167 以下是在erlang项目开发中的一些记录,即包含很多通俗易懂的原则,也包含一些似是而非的建议,比较混乱,还没有积累到一个可以分门 ...
- Tomcat系列之服务器的安装与配置以及各组件详解
Tomcat系列之服务器的安装与配置以及各组件详解 大纲 一.前言 二.安装与配置Tomcat 三.Tomcat 目录的结构 四.Tomcat 配置文件 注,本文的测试的操作系统为CentOS 6.4 ...
- 入坑cordova
原文:入坑cordova 因项目需要入坑cordova,奔跑吧骚年,目前只是要求安卓平台,下面都是以安卓为例 最好的学习资料还是官网. https://cordova.apache.org/ http ...
- DOS批处理
DOS批处理命令-注释 注释是每个程序中不可或缺的(不是对计算机来说,而是对我们这些程序员阅读代码来说) 语法: ①rem 这是批处理的注释命令,rem后面的内容全部是注释 例:rem 这是一行注 ...
- ant的condition任务
1.istrue isfalse:断言 真 假 <project name="testCondition"> <target name="test&qu ...
- Visual Studio for Mac第四预
微软发布Visual Studio for Mac第四预览版 去年 11 月,微软发布了 Visual Studio for Mac 的首个预览版本,并且承诺后续数月会带来更多功能.而今天,随着 Vi ...
- 给博客签上CC协议
大家都知道开源软件.通过开放源代码的方式,允许用户学习.修改.增进提高这些软件质量.软件界的开源协议很多,比如常见的 Apache,BSD,GPL 等等.这是一种充分利用网络的便利性,鼓励分享和创新的 ...