利用反射将xml转换为List<Object>

在将xml转为实体类的时候,一直对于类型为Integer,  date等的很难处理, 无法转换, 但是后来我发现通过反射可以解决这一问题, 下面和大家分享一下

首先: 给出一个实体类

public class Glxt19K01 {

    private String jylsh;  //     检验流水号     varchar2
    private String jyjgbh;
    private String jcxdh;  //     检测线代号     varchar2
    private Integer jycs;  //     检验次数     number
    private String hpzl;  //     号牌种类     varchar2
    private String hphm;  //     号牌号码     varchar2
    private String clsbdh;  //     车辆识别代号     varchar2
    private String jyxm;  //     检验项目     varchar2
    private String bxpzh;  //     保险凭证号     varchar2
    private BigDecimal bxje;  //     保险金额     number
    private String bxgs;  //     保险公司     varchar2
    private Date sxrq;  //     生效日期     date
    private Date zzrq;  //     终止日期     date
    private Timestamp jyrq;
    private Integer pdazt;

// get set方法

}

其次:我将真实具体的实现方法,这三个参数大家可以在测试的时候可以看出来,往下看看

public static List<Object> readXML(String tr2, String s, Class<?> clazz) {    //long lasting = System.currentTimeMillis();//效率检测    List<Object> list = new ArrayList();//创建list集合    try {        //1.创建一个SAXBuilder的对象        SAXReader reader = new SAXReader();        org.dom4j.Document doc = reader.read(new InputSource(new ByteArrayInputStream(s.getBytes("GBK"))));//dom4j读取        // 4.通过document对象获取xml文件的根节点        org.dom4j.Element root = doc.getRootElement();//获得根节点        // 5. 获取根节点下的子节点body        org.dom4j.Element body = root.element("body");        // 6. 获取根节点下的二级节点        org.dom4j.Element foo;

for (Iterator i = body.elementIterator(tr2); i.hasNext(); ) {//遍历t.getClass().getSimpleName()节点            foo = (org.dom4j.Element) i.next();//下一个二级节点            //实例化Object对象            Object obj = clazz.newInstance();            Field[] properties = obj.getClass().getDeclaredFields();//获得实例的属性            //实例的get方法            Method getmeth;            //实例的set方法            Method setmeth;            for (int j = 0; j < properties.length; j++) {                //实例的set方法                setmeth = obj.getClass().getMethod(                        "set"                                + properties[j].getName().substring(0, 1).toUpperCase()                                + properties[j].getName().substring(1), properties[j].getType());                Object setStr = foo.elementText(properties[j].getName());                //System.out.println(properties[j].getName() + "类型是" + properties[j].getType());                if (foo.elementText(properties[j].getName()) != null) {                    if (properties[j].getType() == java.util.Date.class) {                        setStr = TransDate.String2Date(foo.elementText(properties[j].getName()));                    } else if (properties[j].getType() == java.lang.Integer.class) {                        setStr = Integer.parseInt(foo.elementText(properties[j].getName()));                    } else if (properties[j].getType() == java.lang.Character.class) {                        setStr = foo.elementText(properties[j].getName()).charAt(0);                    } else if (properties[j].getType() == java.sql.Timestamp.class) {                        setStr = Timestamp.valueOf(foo.elementText(properties[j].getName()));                    }                } else {                    setStr = null;                }                setmeth.invoke(obj, setStr);//将对应节点的值存入            }            list.add(obj);        }    } catch (Exception e) {        e.printStackTrace();    }    return list;}

最后:我们就测试一下啊

String s="<?xml version=\"1.0\" encoding=\"GBK\"?><root><body><vehispara><jylsh>37030118032900001</jylsh><jcxdh>1</jcxdh><jycs>1</jycs><hpzl>02</hpzl><hphm>鲁CK0048</hphm><clsbdh>LVZX32K7XDC517343</clsbdh><jyxm>F1,C1,DC,B1,B2,B0,H1,H4</jyxm><bxpzh></bxpzh><bxje>0</bxje><bxgs></bxgs><sxrq>2017-08-03</sxrq><zzrq>2018-08-03</zzrq><pdazt>1</pdazt></vehispara></body></root>";
 //       List<Object> vehispara = QueryResult.readXML("vehispara", s, Glxt19K01.class);

        List<Glxt19K01> list = new ArrayList<Glxt19K01>();
        for (int i = 0; i < vehispara.size(); i++) {        //将List<Object>转为对应的实体类
            list.add((Glxt19K01) vehispara.get(i));
        }
        for (int a = 0; a < list.size(); a++) {

            System.out.println("_______________________" + list.get(a));
        }

这样我们就实现了啊

原文地址:https://www.cnblogs.com/514929hgy/p/9143182.html

时间: 2024-10-24 12:49:51

利用反射将xml转换为List<Object>的相关文章

利用反射把Datatable转换成List

/// <summary>        /// 利用反射将Datatable转换为List<T>对象        /// </summary>        /// <typeparam name="T">集合</typeparam>        /// <param name="dt"> datatable对象</param>        /// <returns&g

利用反射实现工厂模式

需求:工厂类根据参数生成对应类的实例. 示例: RoomParts.cs namespace ReflectionFactory { /// <summary> /// 屋子产品的零件 /// </summary> public enum RoomParts { Roof, Window, Pillar } } ProductAttribute.cs using System; namespace ReflectionFactory { /// <summary> //

解如何利用 XML 和 JavaScript Object Notation 在 Ajax 客户端和 Java 服务器之间传输数据。

2006 年 6 月发表 Ajax 核心 API(即所谓的 XMLHttpRequest)的唯一用途就是发送 HTTP 请求,在 Web 浏览器与服务器之间进行数据交换.Web 页面中运行的 JavaScript 代码,可以使用 XMLHttpRequest 将该请求参数提交至服务器端脚本,例如 Servlet 或 JSP 页面.调用的 Servlet/JSP 将发回一个响应,其中包含了一般用于不需刷新整个页面即可更新用户查看内容的数据.此种方法在性能和可用性方面均体现出了独有的优势,因为这将降

利用反射创建实例强制转换为接口失败小结

最近码代码是遇到一个很奇怪的问题,利用反射创建实例对象后强制转换为接口类型时抛出异常 然后看了下类的继承关系 没有问题,查看代码用 m_queryImplementAssembly = Assembly.Load(m_queryImplementAssemblyName); m_queryImplementAssembly.CreateInstance(strInstanceName);也不应该会出问题, 后来换了一种方式Activator.CreateInstance仍然无果.就这样纠结了一天

利用反射模拟一个spring的内部工作原理

这个简单的案例是实行了登录和注册的功能,没有链接数据库. 在bean中id 是唯一的,id和name的区别在于id不能用特殊字符而name可以用特殊字符,比如:/-\.... 1 package com.obtk.reflect; 2 3 public class Logon { 4 /** 5 * 帐号密码长度大于六位字符就成功,否则失败! 6 * */ 7 public String select(String name, String pass) { 8 if (name.length()

利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理

利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论:0 | 浏览:45 | 该类在MVC中可以方便管理配置信息,可以直接把Model储存进数据库或者从数据库去除数据转为Model. 1 何为配置项目? 比如网站的名称,页脚信息,meta中的KeyWord信息等,如果不想硬编码到网页里,就需要使用配置文件进行储存,通常都是储存到数据库中.使用的时候读取出来

利用反射和配置文件结合的方式,动态切换方法运行的案列

package com.itcast.reflect; import java.io.InputStream;import java.lang.reflect.Method;import java.util.Properties; /** * @author newcityman * @date 2019/8/8 - 23:07 * 框架类:利用反射和properties配置文件结合的方式 * 在不改变java代码的情况下,通过修改配置文件的方法,来改变运行方法的切换 */public clas

利用反射动态操作数组

java语言中,数组对象并不是从某个类实例化出来的,而是JVM动态创建的.对数组对象使用如下操作,可看到数组对应的Class对象.通过RTTI(Run-Time Type Information)可直接检查数组的运行时类型,以及它的签名.下方的 "[L"就是int[]/Integer[] 的运行类型. 1 Integer[] integers = (Integer[]) Array.newInstance(Integer.class,4); 2 System.out.println(i

C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值

转自goldeneyezhang原文 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值总结: 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();//获得该类的Type //再用Type.GetProperties获得PropertyInfo[],然后就可以用foreach 遍历了 foreach (PropertyInfo pi