您的位置:首页 > 编程语言 > Java开发

JavaBean、List与XML之间的互相转换

2016-05-26 11:44 399 查看
本人最近在研究一个javaBean、List和Xml之间互相转换,整合了一个工具类,直接贴代码。希望对需要的人有帮助!package com.yuntai.handle;import java.beans.BeanInfo;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.ParameterizedType;import
java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.apache.log4j.Logger;import org.dom4j.Document;import org.dom4j.DocumentException;import
org.dom4j.DocumentHelper;import org.dom4j.Element;/** * 该工具类整合了,bean,list转换成xml,以及其反向转换 * * */public class XmlUtil{private static Logger logger = Logger.getLogger(XmlUtil.class);/** * 将object 转换成xmlString * @param obj * @return */public static String getRequestXMLString(
Object param ){if("java.util.List".equals( param.getClass().getName() ) ||"java.util.ArrayList".equals( param.getClass().getName() ) ||"java.util.LinkedList".equals( param.getClass().getName() ) )return getRequestXMLString1( translistToMap(( List <?> )param));return
getRequestXMLString1( transBean2Map(param) );}/** *object 获取 responseXML * @param obj * @return */public static String getResponseXMLString( Object ret) {if("java.util.List".equals(ret.getClass().getName()) ||"java.util.ArrayList".equals(ret.getClass().getName())
||"java.util.LinkedList".equals(ret.getClass().getName()))return getResponseXMLString1( translistToMap(( List <?> )ret));return getResponseXMLString1(transBean2Map(ret));}/** * 将请求或者接受到的xmlString转换成JavaBean * @param map * @param cls * @return */@SuppressWarnings("rawtypes")public
static Object parametersToJavaBean(String xmlString, Class cls) {return parametersToJavaBean( Dom2Map(xmlString) , cls);}/** * 将请求或者接受到的xmlString转换成List<?> * @param map * @param cls * @return */@SuppressWarnings("rawtypes")public static List<?> parametersToList(String
xmlString, Class cls) {return parametersToList( Dom2Map(xmlString) , cls);}/** * 将map转换成 requestXmlString * @param params * @return */private static String getRequestXMLString1( Map params){return getXMLString(params, "Request");}/** * map获得response XML *
@param params * @return */private static String getResponseXMLString1(Map ret) {return getXMLString(ret,"Response");}/** * Transfer xmlString to Map * @param xmlStr * @return */public static Map Dom2Map(String xmlStr){Document doc = null;try {doc = DocumentHelper.parseText(xmlStr);}
catch (DocumentException e) {logger.error("xml analyze error ", e);e.printStackTrace();}return Dom2Map(doc);}/** * Transfer Document to Map * @param xmlStr * @return */@SuppressWarnings({ "rawtypes" })private static Map Dom2Map(Document doc){ Map map = new
HashMap(); if(doc == null) return map; Element root = doc.getRootElement(); Iterator iterator = root.elementIterator();while ( iterator.hasNext() ) { Element e = (Element) iterator.next(); List list = e.elements(); //根元素response 获取list 大于0 是list或者objectif(
list.size() > 0){ map.put(e.getName(), Dom2Map(e)); } else {map.put(e.getName(), e.getText());}} return map; } /** * Transfer Element to Map * @param xmlStr * @return */@SuppressWarnings({ "rawtypes", "unchecked" })private static Map Dom2Map(Element e){ Map
map = new HashMap(); List list = e.elements(); if(list.size() > 0){ for (int i = 0;i < list.size(); i++) { Element iter = (Element) list.get(i); List mapList = new ArrayList(); if(iter.elements().size() > 0){ Map m = Dom2Map(iter); if(map.get(iter.getName())
!= null){ Object obj = map.get(iter.getName()); if(!obj.getClass().getName().equals("java.util.ArrayList")){ mapList = new ArrayList(); mapList.add(obj); mapList.add(m); } if(obj.getClass().getName().equals("java.util.ArrayList")){ mapList = (List) obj; mapList.add(m);
} map.put(iter.getName(), mapList); }else map.put(iter.getName(), m); } else{ if(map.get(iter.getName()) != null){ Object obj = map.get(iter.getName()); if(!obj.getClass().getName().equals("java.util.ArrayList")){ mapList = new ArrayList(); mapList.add(obj);
mapList.add(iter.getText()); } if(obj.getClass().getName().equals("java.util.ArrayList")){ mapList = (List) obj; mapList.add(iter.getText()); } map.put(iter.getName(), mapList); }else map.put(iter.getName(), iter.getText()); } } }else map.put(e.getName(),
e.getText()); return map; } @SuppressWarnings("unchecked")private static String getXMLString(Map params,String oper) {Document document = DocumentHelper.createDocument();document.setXMLEncoding(ConstData.DefaultCharset);Element Response = document.addElement(oper);
if(params != null){Iterator it = params.keySet().iterator();while(it.hasNext()){String key = it.next();Object value = params.get(key);Element element = Response.addElement(key);//如果属性为 map map 的key必须以字母开头或汉字开头,不能以数字开头 ,xml 数据格式要求if(value instanceof Map){Iterator
itSub = ((Map) value).keySet().iterator();while(itSub.hasNext()){String keySub = itSub.next();Object valueSub = ((Map) value).get(keySub);Element elementSub = element.addElement(keySub);elementSub.setText(valueSub == null ? "" : valueSub.toString());}}else
if(value instanceof List){Iterator<Map> itLis = ((List<Map>) value).iterator();while(itLis.hasNext()){Map subMap = (Map)itLis.next();// 前几位加-1Element elementItem = element.addElement(key.substring(0, key.length()-1));Iterator itSub = subMap.keySet().iterator();while(itSub.hasNext()){String
keySub = itSub.next();Object valueSub = subMap.get(keySub);Element elementSub = elementItem.addElement(keySub);elementSub.setText(valueSub == null ? "" : valueSub.toString());}}}else{element.setText(value == null ? "" : value.toString());}}}return document.asXML();}public
static void parseXML(Element element, String node, List valueList) { @SuppressWarnings("rawtypes")List elements = element.elements();Element elem = null;for (int i = 0; i < elements.size(); i++) {elem = (Element) elements.get(i);// 循环依次得到子元素if(elem.getName().equals(node)){valueList.add(elem.getTextTrim());}if(elem.elements().size()
> 0) {parseXML(elem, node, valueList);}}}@SuppressWarnings({ "rawtypes", "unchecked" })private static ListparametersToList(Map map, Class cls) {Listlist = new ArrayList<>();try {List<Map> listMap =(List<Map>)((Map) map.get("items")).get("item");for(Map m:listMap){Object
obj= parametersToJavaBean(m, cls);list.add(obj);}} catch (ClassCastException e) {Map m = (Map)((Map) map.get("items")).get("item");Object obj= parametersToJavaBean(m, cls);list.add(obj);}return list;}/** * 将map转换成JavaBean * @param map * @param cls * @return
*/@SuppressWarnings("rawtypes")private static Object parametersToJavaBean(Map map, Class cls) {Object obj = null;try {obj = cls.newInstance();BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for
(PropertyDescriptor property : propertyDescriptors) {String key = property.getName();Class<?> filedTypeClazz = property.getPropertyType();// 过滤class属性if (!key.equals("class")) {// 得到property对应的getter方法Method setter = property.getWriteMethod();if(map.containsKey(key)
&& setter != null)setValue(filedTypeClazz, key ,map.get(key), setter, obj);}}} catch (Exception e) {logger.debug(" transBean2Map Error " + e);}return obj;}/** * * @param typeClazz * @param key * @param value * @param setter * @param bean */@SuppressWarnings({
"unused", "unchecked" })private static void setValue(Class<?> typeClazz, String key ,Object value,Method setter, Object bean) {if (value != null && !value.equals("")) {try {String clazzString = typeClazz.getName().substring(typeClazz.getName().lastIndexOf(".")+1);if
(clazzString.equals("String") || clazzString.equals("Object") ||clazzString.equals("Map") || clazzString.equals("HashMap")) {setter.invoke( bean, new Object [] { value });} else if ( clazzString.equals("List") ||clazzString.equals("ArrayList") ) {ListreturnList
= new ArrayList<>();// 获取list里的泛型 得到class 必须为public属性ParameterizedType pt = (ParameterizedType) bean.getClass().getDeclaredField( key).getGenericType();String listBeanName = pt.getActualTypeArguments()[0].toString();Class<?> cls = Class.forName(listBeanName.substring(6));//class
com.hundsunObject listBean = cls.newInstance();//可能是list 或者 map 转型出现异常,捕获后 得到单个对象value = ((Map) value).get(key.substring(0,key.length()-1));try {List<Map> proListMap = (List<Map>)value;for (Map m : proListMap) {Object listObj = parametersToJavaBean(m, cls);returnList.add(listObj);}}
catch (ClassCastException e) {Map itemMap = (Map) value;Object listObj = parametersToJavaBean(itemMap, cls);returnList.add(listObj);}setter.invoke(bean, new Object[] { returnList });}else if(clazzString.equals("PatientQueueViewInfoBean")){//含有bean的 只有 排队叫号中的PatientQueueViewInfoBean@SuppressWarnings("rawtypes")PatientQueueViewInfoBean
patientQueueBean = (PatientQueueViewInfoBean)parametersToJavaBean((HashMap) value, PatientQueueViewInfoBean.class);setter.invoke(bean, patientQueueBean);} else if (clazzString.equals("int") || clazzString.equals("Integer")) {setter.invoke(bean, new Object[]
{ new Integer(""+ value) });} else if (clazzString.equals("double") || clazzString.equals("Double")) {setter.invoke(bean, new Object[] { new Double(""+ value) });} else if (clazzString.equals("long") || clazzString.equals("Long")) {setter.invoke(bean,new Object[]
{ new Long("" + value) });} else if (clazzString.equals("boolean") || clazzString.equals("Boolean")) {setter.invoke(bean,new Object[] { Boolean.valueOf("" + value) });} else if (clazzString.equals("Date")) {Date date = null;if (value.getClass().getName().equals("java.util.Date"))
{date = (Date) value;} else {String format = ((String) value).indexOf(":") > 0 ? "yyyy-MM-dd hh:mm": "yyyy-MM-dd";date = parseDateTime("" + value, format);}if (date != null) {setter.invoke(bean, new Object[] { date });}} else if (clazzString.equals("byte[]"))
{setter.invoke(bean,new Object[] { new String(value + "").getBytes() });} else if (clazzString.equals("String[]")) {setter.invoke(bean,new Object[] { (String[])value });} } catch (Exception e) {logger.debug(" 将linkHashMap 或 HashTable 里的值填充到javabean时出错,请检查!"+e);}}}private
static Date parseDateTime(String dateValue, String format) {SimpleDateFormat obj = new SimpleDateFormat(format);try {return obj.parse(dateValue);} catch (Exception e) {e.printStackTrace();}return null;}// Bean --> Map 1: 利用Introspector和PropertyDescriptor 将Bean
--> Map(带父类的属性)private static Map transBean2Map(Object obj) {if(obj == null){return null;} Map map = new HashMap();try {BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for
(PropertyDescriptor property : propertyDescriptors) {String key = property.getName();Class<?> clz = property.getPropertyType();// 过滤class属性if (!key.equals("class")) {// 得到property对应的getter方法Method getter = property.getReadMethod();Object value = getter.invoke(obj);if(clz.isInstance(new
PatientQueueViewInfoBean())){value = transBean2Map((PatientQueueViewInfoBean)value);} else if(clz.isInstance(new ArrayList<>())){value = transList2Map((List<?>)value);} map.put(key, value);}}} catch (Exception e) {logger.debug(" transBean2Map Error " + e);}return
map;}//把list集合转化成 List<Map>private static List<Map> transList2Map(List<?> sublist) {List<Map> listMap = new ArrayList<>();if(sublist != null && !sublist.isEmpty()){for(Object obj : sublist){Map itemMap =transBean2Map(obj);listMap.add(itemMap);}}return listMap
;}/** * 把list转换成 map * @param list * @return */public static Map translistToMap(List<?> beanlist) {Map map = new HashMap<>();map.put("items", transList2Map(beanlist));return map;}//不带父类的属性public static Map convertBeanToMap(Object bean) throws IllegalArgumentException,
IllegalAccessException{ Field[] fields = bean.getClass().getDeclaredFields(); HashMap data = new HashMap(); for(Field field : fields){ field.setAccessible(true); data.put(field.getName(), field.get(bean)); } return data; } }代码可以请各位优化下。调用如下:public static void
main(String[] args) throws Exception {CheckSheetListHAO param = new CheckSheetListHAO();param.setPatName("蔡源");PatCardEntity card1 = new PatCardEntity();card1.setPatCardNo("0001136144");PatCardEntity card2 = new PatCardEntity();card2.setPatCardNo("0001136144");List
cards = new ArrayList();cards.add(card1);cards.add(card2);param.setCards(cards);System.out.println(getRequestXMLString(param)); CheckSheetListHAO ret =(CheckSheetListHAO)parametersToJavaBean(getRequestXMLString(param), CheckSheetListHAO.class);}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: