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\"?>\n" +
                "<root>\n" +
                "<head>\n" +
                "<code>1</code>\n" +
                "<message>數據下載成功!</message>\n" +
                "<rownum>1</rownum>\n" +
                "</head>\n" +
                "<body>\n" +
                "<vehispara id=\"0\">\n" +
                "  <dtdpjyxm></dtdpjyxm>\n" +
                "  <pdyj>2</pdyj>\n" +
                "  <zlzp>0201,0202,0203,0204,0205,0206,0211,0209,0212,0213</zlzp>\n" +
                "  <yqsbjyxm>B1,B2,H1,H2,H3,H4</yqsbjyxm>\n" +
                "  <cyxm></cyxm>\n" +
                "  <cyzp>0111,0112,0113,0119,0115,0171,0174</cyzp>\n" +
                "  <hphm></hphm>\n" +
                "  <dpjyxm></dpjyxm>\n" +
                "  <jyjgbh>3703000017</jyjgbh>\n" +
                "  <jylsh>我是1</jylsh>\n" +
                "  <wgjyzp>0111,0112,0113,0119,0115,0171,0174</wgjyzp>\n" +
                "  <hpzl>02</hpzl>\n" +
                "  <wgjcxm>01,02,03,04,05,09,16,17,18,19,20,21,22,23,80</wgjcxm>\n" +
                "</vehispara>\n" +

                "<vehispara id=\"1\">\n" +
                "  <dtdpjyxm></dtdpjyxm>\n" +
                "  <pdyj>2</pdyj>\n" +
                "  <zlzp>0201,0202,0203,0204,0205,0206,0211,0209,0212,0213</zlzp>\n" +
                "  <yqsbjyxm>B1,B2,H1,H2,H3,H4</yqsbjyxm>\n" +
                "  <cyxm></cyxm>\n" +
                "  <cyzp>0111,0112,0113,0119,0115,0171,0174</cyzp>\n" +
                "  <hphm>魯CZ513M</hphm>\n" +
                "  <dpjyxm></dpjyxm>\n" +
                "  <jyjgbh>3703000017</jyjgbh>\n" +
                "  <jylsh>你是2</jylsh>\n" +
                "  <wgjyzp>0111,0112,0113,0119,0115,0171,0174</wgjyzp>\n" +
                "  <hpzl>02</hpzl>\n" +
                "  <wgjcxm>01,02,03,04,05,09,16,17,18,19,20,21,22,23,80</wgjcxm>\n" +
                "</vehispara>\n" +
                "</body>\n" +
                "</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

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM