zoukankan      html  css  js  c++  java
  • Java中将xml转为List<实体类>

            我是一个IT新人,刚进入公司遇到了将Xml转为List<实体类>的情况,网上搜了一些资料,最后终于搞定,在这里分享一下

    第一步:给出一个实体类C47

    public class C47 {
        private String code;
        private String message;
        private String rownum;
        private String jylsh;       //检验流水号    varchar2
        private String jyjgbh;       //    检验机构编号    varchar2
        private String hphm;       //    号牌号码    varchar2
        private String hpzl;       //    号牌种类    varchar2
        private String wgjyzp;       //    外观检验照片    varchar2
        private String zlzp;       //    资料照片    varchar2
        private String wgjcxm;       //    外观检验项目    varchar2
        private String dtdpjyxm;       //    底盘动态检验项目    varchar2
        private String dpjyxm;       //    底盘检验项目    varchar2
        private String pdyj;       //    判定依据    char
        private String yqsbjyxm;       //    仪器设备检验项目    varchar2
    
    }

    第二步:将Xml转换为map放到List容器里面

     public static List<Map<String, Object>> xmlToMap(String result) throws IOException, SAXException, ParserConfigurationException {
    
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
    
            Document doc = db.parse(new InputSource(new ByteArrayInputStream(result.getBytes("GBK"))));
            NodeList bookList = doc.getElementsByTagName("vehispara");
    
            List<Map<String, Object>> list = new ArrayList();
    
            for (int i = 0; i < bookList.getLength(); i++) {
                Node book = bookList.item(i);
                NamedNodeMap attrs = book.getAttributes();
                for (int j = 0; j < attrs.getLength(); j++) {
                    Node attr = attrs.item(j);
                }
                NodeList childNodes = book.getChildNodes();
                Map<String, Object> map = new HashMap();
                for (int k = 0; k < childNodes.getLength(); k++) {
    
                    String Code = doc.getElementsByTagName("code").item(0).getChildNodes().item(0).getNodeValue();
                    String Message = doc.getElementsByTagName("message").item(0).getChildNodes().item(0).getNodeValue();
                    String Rownum = doc.getElementsByTagName("rownum").item(0).getChildNodes().item(0).getNodeValue();
    
                    map.put("code", Code);
                    map.put("message", Message);
                    map.put("rownum", Rownum);
    
                    //组织成某种格式 传回去然后 再转成entity
                    if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
                        String name = childNodes.item(k).getNodeName();
                        String value = childNodes.item(k).getTextContent();
                        //set key,value
                        map.put(name, value);
                    }
                }
                list.add(map);
            }
            return list;
        }

    第三步:将第二步中返回的map转换为实体类

        public static Object transMap2Bean(Map<String, Object> map, Object obj) {
            try {
                BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
                PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
    
                for (PropertyDescriptor property : propertyDescriptors) {
                    String key = property.getName();
                    if (map.containsKey(key)) {
                        Object value = map.get(key);
                        // 得到property对应的setter方法
                        Method setter = property.getWriteMethod();
                        setter.invoke(obj, value);
                    }
                }
            } catch (Exception e) {
            }
            return obj;
        }

     第三步: 遍历第一步返回的List,转换为实体类存放到List里面

     public static List<Object> getBeans(List<Map<String, Object>> list,Class<?> clazz) {
            Object obj1 = null;
            List<Object> list1 = new ArrayList<Object>();
            for (int i = 0; i < list.size(); i++) {
                Map<String, Object> stringObjectMap = list.get(i);
                Object obj =null;
                try {
                    obj=clazz.newInstance();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                obj1 = transMap2Bean(stringObjectMap, obj);
                list1.add(obj1);
            }
            return list1;
        }

    方法已经完成,接下来我们测试一下哦

    public static void main(String[] args) throws Exception {
    //给出的Xml的String型
            String s = "<?xml version="1.0" encoding="GBK"?>
    " +
                    "<root>
    " +
                    "<head>
    " +
                    "<code>1</code>
    " +
                    "<message>数据下载成功!</message>
    " +
                    "<rownum>1</rownum>
    " +
                    "</head>
    " +
                    "<body>
    " +
                    "<vehispara id="0">
    " +
                    "  <dtdpjyxm></dtdpjyxm>
    " +
                    "  <pdyj>2</pdyj>
    " +
                    "  <zlzp>0201,0202,0203,0204,0205,0206,0211,0209,0212,0213</zlzp>
    " +
                    "  <yqsbjyxm>B1,B2,H1,H2,H3,H4</yqsbjyxm>
    " +
                    "  <cyxm></cyxm>
    " +
                    "  <cyzp>0111,0112,0113,0119,0115,0171,0174</cyzp>
    " +
                    "  <hphm></hphm>
    " +
                    "  <dpjyxm></dpjyxm>
    " +
                    "  <jyjgbh>3703000017</jyjgbh>
    " +
                    "  <jylsh>我是1</jylsh>
    " +
                    "  <wgjyzp>0111,0112,0113,0119,0115,0171,0174</wgjyzp>
    " +
                    "  <hpzl>02</hpzl>
    " +
                    "  <wgjcxm>01,02,03,04,05,09,16,17,18,19,20,21,22,23,80</wgjcxm>
    " +
                    "</vehispara>
    " +
    
                    "<vehispara id="1">
    " +
                    "  <dtdpjyxm></dtdpjyxm>
    " +
                    "  <pdyj>2</pdyj>
    " +
                    "  <zlzp>0201,0202,0203,0204,0205,0206,0211,0209,0212,0213</zlzp>
    " +
                    "  <yqsbjyxm>B1,B2,H1,H2,H3,H4</yqsbjyxm>
    " +
                    "  <cyxm></cyxm>
    " +
                    "  <cyzp>0111,0112,0113,0119,0115,0171,0174</cyzp>
    " +
                    "  <hphm>鲁CZ513M</hphm>
    " +
                    "  <dpjyxm></dpjyxm>
    " +
                    "  <jyjgbh>3703000017</jyjgbh>
    " +
                    "  <jylsh>你是2</jylsh>
    " +
                    "  <wgjyzp>0111,0112,0113,0119,0115,0171,0174</wgjyzp>
    " +
                    "  <hpzl>02</hpzl>
    " +
                    "  <wgjcxm>01,02,03,04,05,09,16,17,18,19,20,21,22,23,80</wgjcxm>
    " +
                    "</vehispara>
    " +
                    "</body>
    " +
                    "</root>";
    
            //TreeUtil是上面三个方法的实体类
            List<Map<String, Object>> list = TreeUtil.xmlToMap(s);
            //C47是我们要转换成的实体类
            List<Object> beans = TreeUtil.getBeans(TreeUtil.xmlToMap(s),C47.class);
            //我们遍历看一下结果哦
            for (int i = 0; i < beans.size(); i++) {
                System.out.println("结果是" + i + "    " + beans.get(i));
            }

    是不是很期待结果哦

    ______________________________

    结果是0    C47{code='1', message='数据下载成功!', rownum='1', jylsh='我是1', jyjgbh='3703000017', hphm='', hpzl='02', wgjyzp='0111,0112,0113,0119,0115,0171,0174', zlzp='0201,0202,0203,0204,0205,0206,0211,0209,0212,0213', wgjcxm='01,02,03,04,05,09,16,17,18,19,20,21,22,23,80', dtdpjyxm='', dpjyxm='', pdyj='2', yqsbjyxm='B1,B2,H1,H2,H3,H4'}
    结果是1    C47{code='1', message='数据下载成功!', rownum='1', jylsh='你是2', jyjgbh='3703000017', hphm='鲁CZ513M', hpzl='02', wgjyzp='0111,0112,0113,0119,0115,0171,0174', zlzp='0201,0202,0203,0204,0205,0206,0211,0209,0212,0213', wgjcxm='01,02,03,04,05,09,16,17,18,19,20,21,22,23,80', dtdpjyxm='', dpjyxm='', pdyj='2', yqsbjyxm='B1,B2,H1,H2,H3,H4'}

     _______________________________

    结果正如我们期待的,但是有一个局限性就是:返回的实体类的字段属性只是String类型,大家使用的时候一定要注意哦!

    有没有好的解决方法,求帮忙!!!!!!!

    关于上面的局限性问题,我已经解决, 大家可以参考这个链接  :  https://www.cnblogs.com/514929hgy/p/9143182.html

    希望可以帮助大家!!!!!!

  • 相关阅读:
    android逆向奇技淫巧五:x音fiddler抓包分析协议字段
    windows:3环自行加载PE文件实现进程隐藏
    android逆向奇技淫巧四:模拟器检测和反检测
    android逆向奇技淫巧三:MT管理器替代android killer修改和重新编译smail代码/frida hook 更改so层代码
    windows运算符和数据类型重载反CE查询搜索
    android逆向奇技淫巧二:uiautomatorviewer&method profiling定位x音java层的关键代码和方法
    android逆向奇技淫巧一:去掉开屏广告
    xx课堂m3u8加密视频下载
    Python接口自动化之logging日志
    Python接口自动化之pymysql数据库操作
  • 原文地址:https://www.cnblogs.com/514929hgy/p/9124761.html
Copyright © 2011-2022 走看看