/// <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字符串,通过反射给实体类对象赋值,获取实体类数据列表的更多相关文章

  1. c# 利用反射动态给实体类对象赋值

    转:http://blog.sina.com.cn/s/blog_659a572b0100xp5s.html 例子如下 using System; using System.Collections.G ...

  2. java解析xml字符串为实体(dom4j解析)

    package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...

  3. tinyXml直接解析XML字符串

    一直都用tinyxml直接LoadFile来解析XML,发现原来也可以直接解析XML字符串. XML文件: <?xml version=\"1.0\" encoding=\& ...

  4. 解析xml字符串时报“前言中不允许有内容”错误。

    一,问题出现经过: j基于java语言webservic服务端接收客户端 传来的xml字符串用 解析时总报:org.dom4j.DocumentException: Error on line 1 o ...

  5. dom4j解析xml字符串实例

    DOM4J 与利用DOM.SAX.JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异.功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml ...

  6. java解析xml字符串(用dom4j)

    package com.smsServer.Dhst; import java.util.HashMap; import java.util.Iterator; import java.util.Ma ...

  7. C++解析XML字符串

    项目交互遇到了需要VC++中解析XML字符串,故花了点时间了解了下VC++中解析XML的诸多方法主要包括三种:msxml(微软提供).markup.TinyXml. 开始花了点时间使用msxml3,虽 ...

  8. Android利用反射机制为实体类属性赋值

    在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面 ...

  9. Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)

    上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...

随机推荐

  1. Opencv Sift和Surf特征实现图像无缝拼接生成全景图像

    Sift和Surf算法实现两幅图像拼接的过程是一样的,主要分为4大部分: 1. 特征点提取和描述 2. 特征点配对,找到两幅图像中匹配点的位置 3. 通过配对点,生成变换矩阵,并对图像1应用变换矩阵生 ...

  2. spring 技巧集锦

    SpringBoot四大神器之Actuator actuator是spring boot提供的对应用系统的自省和监控的集成功能,可以对应用系统进行配置查看.相关功能统计等. <dependenc ...

  3. CentOS 挂载iso文件配置yum源

    1.挂载iso 准备好centos的光盘镜像 挂载前的准备; mkdir -p /dev/centos mkdir -p  /mnt/local_yum 挂载 mount -o loop /opt/s ...

  4. Android - HelloWorld的Layout内容

    Android - HelloWorld的Layout内容 本文地址: http://blog.csdn.net/caroline_wendy 作为最基础的Android程序, HelloWorld的 ...

  5. switch语句中default用法详解

    当年学C语言switch开关语句的时候,很多人会告诉你它是这么用的: switch(表达式){ case常量表达式1: 语句1;break; case常量表达式2: 语句2;break; - case ...

  6. Himi浅谈游戏开发de自学历程!(仅供参考)

    李华明Himi原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/himistudy/382.html ☞ 点击订阅 ☜ 本博客 ...

  7. make 的参数

    1. -j -j(表示 job 的数目)参数可以对项目在进行并行编译,比如在一台双核的机器上,完全可以用 make -j4,让make 最多允许 4 个编译命令同时执行,这样可以更有效的利用 CPU ...

  8. No handler for type [text] declared on field [content]

    Install 1.compile checkout ik version respective to your elasticsearch version git checkout tags/{ve ...

  9. wxWidgets初学者导引(3)——wxWidgets应用程序初体验

    wxWidgets初学者导引全目录   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith ...

  10. 1 DDD理论学习1 通用语言

    通用语言就是将事情描述清楚的语言 达到DDD的目标代码即设计,设计即代码.通俗的讲,也就是开发人员写的代码领域专家也能看懂. ddd模式跟传统模式的一个区别在于 传统先创建数据库表 再根据表创建类.而 ...