我是一個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
希望可以幫助大家!!!!!!