import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter;
import com.longtop.cls.frm.util.StringUtil; import com.sun.jmx.snmp.Timestamp;
public class XmlUtil { private static final String ATTR_ID = "id";// bean的id属性 private static final int NULL_ID = -1; /** * 将bean转换成xml * @param <T> * @param bean * @param el * @return */ public static <T> Element parseBean(T t, Class<?> bean,Element el) { Field[] fields = bean.getDeclaredFields();// 获得bean的所有属性 for (Field field : fields) {// 迭代属性并且赋值 int mod = field.getModifiers(); if (Modifier.isFinal(mod) || Modifier.isStatic(mod) || Modifier.isPublic(mod)) { continue; } field.setAccessible(true);// 打破封装性 String attr_name = GetAttrName(bean, field);// 获取bean属性对应的xml文件中的名字 String attr_value = GetAttrValue(field, t);// 获取此属性对应的值 // System.out.println(attr_name+"="+attr_value); el.addElement(attr_name).setText(attr_value);// 创建属性并赋值 } return el; } /** * xml字符串转换成bean对象 * * @param xmlStr xml字符串 * @param clazz 待转换的class * @return 转换后的对象 */ public static Object xmlStrToBean(Element xmlStr, Class clazz) { Object obj = null; try { // 将xml格式的数据转换成Map对象 Map<String, Object> map = xmlStrToMap(xmlStr); //将map对象的数据转换成Bean对象 obj = mapToBean(map, clazz); } catch(Exception e) { e.printStackTrace(); } return obj; } /** * 将List<bean>转换成xml * @param <T> * @param list * @param bean * @return */ public static <T> String parseList(List<T> list, Class<?> bean) { Document document = DocumentHelper.createDocument();// 获取document document.setXMLEncoding("UTF-8");// 设置编码 Element root = document.addElement(GetRootName(bean));// 创建根元素 Field[] fields = bean.getDeclaredFields();// 获得bean的所有属性 for (T elem : list) {// 开始迭代传入的list Element child = root.addElement(GetElemName(bean));// 创建子元素 for (Field field : fields) {// 迭代属性并且赋值 int mod = field.getModifiers(); if (Modifier.isFinal(mod) || Modifier.isStatic(mod) || Modifier.isPublic(mod)) { continue; } field.setAccessible(true);// 打破封装性 String attr_name = GetAttrName(bean, field);// 获取bean属性对应的xml文件中的名字 String attr_value = GetAttrValue(field, elem);// 获取此属性对应的值 System.out.println(attr_name+"="+attr_value); child.addElement(attr_name).setText(attr_value);// 创建属性并赋值 } } return document.asXML(); } // 根据bean自动构建xml的root名字 public static String GetRootName(Class<?> bean) { //String root_name = "_" + bean.getSimpleName().toLowerCase() + "s"; return null; } // 根据bean自动构建xml的child名字 public static String GetElemName(Class<?> bean) { //String elem_name = "_" + bean.getSimpleName().toLowerCase(); return null; } // 根据bean和field构建xml中child的attribute名字 public static String GetAttrName(Class<?> bean, Field field) { String attr_name =field.getName(); return attr_name; } // 根据field与element获取此field对应的value @SuppressWarnings("finally") public static <T> String GetAttrValue(Field field, T elem) { String value = ""; try { Class<?> eType = elem.getClass() ; Class<?> type = field.getType();// 获取此field的类型 /* * 下面依次处理 八种基本类型 Timestamp类型 其他类型(带有id属性的bean类型) */ if (type.equals(Byte.class) || type.equals(byte.class)) { value = field.getByte(elem) + ""; } else if (type.equals(Short.class) || type.equals(short.class)) { value = field.getShort(elem) + ""; } else if (type.equals(Integer.class) || type.equals(int.class)) { value = field.getInt(elem) + ""; } else if (type.equals(Long.class) || type.equals(long.class)) { value = field.getLong(elem) + ""; } else if (type.equals(Float.class) || type.equals(float.class)) { value = field.getFloat(elem) + ""; } else if (type.equals(Double.class) || type.equals(double.class)) { value = field.getDouble(elem) + ""; } else if (type.equals(Boolean.class) || type.equals(boolean.class)) { value = field.getBoolean(elem) + ""; } else if (type.equals(String.class)) { value = (String) field.get(elem); } else if (type.equals(Timestamp.class)) { value = ((Timestamp) field.get(elem)).getDateTime() + ""; } else { // 如果这个类型有id这个属性,说明它是个外键 Field attr_id = type.getDeclaredField(ATTR_ID); // 并且此属性不为null if (attr_id != null && field.get(elem) != null) { attr_id.setAccessible(true); value = attr_id.getInt(field.get(elem)) + ""; } } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } finally { return value == null ? "" : value; } } public static <T> void SetAttrValue(Field field, T elem, String value) { try { Class<?> type = field.getType(); if (type.equals(Byte.class) || type.equals(byte.class)) { try { field.setByte(elem, Byte.parseByte(value)); } catch (NumberFormatException e) { // 数字格式化异常,未做任何处理 } } else if (type.equals(Short.class) || type.equals(short.class)) { try { field.setShort(elem, Short.parseShort(value)); } catch (NumberFormatException e) { // 数字格式化异常,未做任何处理 } } else if (type.equals(Integer.class) || type.equals(int.class)) { try { field.setInt(elem, Integer.parseInt(value)); } catch (NumberFormatException e) { field.setInt(elem, NULL_ID); } } else if (type.equals(Long.class) || type.equals(long.class)) { try { field.setLong(elem, Long.parseLong(value)); } catch (NumberFormatException e) { // 数字格式化异常,未做任何处理 } } else if (type.equals(Float.class) || type.equals(float.class)) { try { field.setFloat(elem, Float.parseFloat(value)); } catch (NumberFormatException e) { // 数字格式化异常,未做任何处理 } } else if (type.equals(Double.class) || type.equals(double.class)) { try { field.setDouble(elem, Double.parseDouble(value)); } catch (NumberFormatException e) { // 数字格式化异常,未做任何处理 } } else if (type.equals(Boolean.class) || type.equals(boolean.class)) { try { field.setBoolean(elem, Boolean.parseBoolean(value)); } catch (Exception e) { e.printStackTrace(); } } else if (type.equals(String.class)) { field.set(elem, value); } else if (type.equals(Timestamp.class)) { try { field.set(elem, new Timestamp(Long.parseLong(value))); } catch (NumberFormatException e) { // 如果格式化异常,说明这个Timestamp是个null字串,当么它的值也为null field.set(elem, null); } } else { Field attr_id = type.getDeclaredField(ATTR_ID); if (attr_id != null) { attr_id.setAccessible(true); Object external = type.newInstance(); try { attr_id.setInt(external, Integer.parseInt(value)); field.set(elem, external); } catch (NumberFormatException e) { // 如果格式化出现异常,那么这个外键为null field.set(elem, null); } } } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } /** * 将xml格式的字符串转换成Map对象 * * @param xmlStr xml格式的字符串 * @return Map对象 * @throws Exception 异常 */ public static Map<String, Object> xmlStrToMap(Element xmlStr) throws Exception { if(StringUtil.isEmpty(xmlStr)) { return null; } Map<String, Object> map = new HashMap<String, Object>(); //获取ReqParam数据 List children = xmlStr.elements(); //循环所有子元素 if(children != null && children.size() > 0) { for(int i = 0; i < children.size(); i++) { Element child = (Element)children.get(i); map.put(child.getName(), child.getTextTrim()); } } return map; } /** * 将Map对象通过反射机制转换成Bean对象 * * @param map 存放数据的map对象 * @param clazz 待转换的class * @return 转换后的Bean对象 * @throws Exception 异常 */ public static Object mapToBean(Map<String, Object> map, Class clazz) throws Exception { Object obj = clazz.newInstance(); if(map != null && map.size() > 0) { for(Map.Entry<String, Object> entry : map.entrySet()) { String propertyName = entry.getKey(); Object value = entry.getValue(); String setMethodName = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1); Field field = getClassField(clazz, propertyName); if(field!=null){ Class fieldTypeClass = field.getType(); value = convertValType(value, fieldTypeClass); clazz.getMethod(setMethodName, field.getType()).invoke(obj, value); } } } return obj; } /** * 将Object类型的值,转换成bean对象属性里对应的类型值 * * @param value Object对象值 * @param fieldTypeClass 属性的类型 * @return 转换后的值 */ private static Object convertValType(Object value, Class fieldTypeClass) { Object retVal = null; if(Long.class.getName().equals(fieldTypeClass.getName()) || long.class.getName().equals(fieldTypeClass.getName())) { retVal = Long.parseLong(value.toString()); } else if(Integer.class.getName().equals(fieldTypeClass.getName()) || int.class.getName().equals(fieldTypeClass.getName())) { retVal = Integer.parseInt(value.toString()); } else if(Float.class.getName().equals(fieldTypeClass.getName()) || float.class.getName().equals(fieldTypeClass.getName())) { retVal = Float.parseFloat(value.toString()); } else if(Double.class.getName().equals(fieldTypeClass.getName()) || double.class.getName().equals(fieldTypeClass.getName())) { retVal = Double.parseDouble(value.toString()); } else { retVal = value; } return retVal; } /** * 获取指定字段名称查找在class中的对应的Field对象(包括查找父类) * * @param clazz 指定的class * @param fieldName 字段名称 * @return Field对象 */ private static Field getClassField(Class clazz, String fieldName) { if( Object.class.getName().equals(clazz.getName())) { return null; } Field []declaredFields = clazz.getDeclaredFields(); for (Field field : declaredFields) { if (field.getName().equals(fieldName)) { return field; } } Class superClass = clazz.getSuperclass(); if(superClass != null) {// 简单的递归一下 return getClassField(superClass, fieldName); } return null; }
public static <T> List<T> ParseXML(String content, Class<?> bean) { List<T> elements = new ArrayList<T>();// 构建一个空的list try { Document document = DocumentHelper.parseText(content);// 根据传入的content获取document Element rootElement = document.getRootElement();// 获取根元素 Field[] fields = bean.getDeclaredFields();// 获取此bean的所有属性 // 迭代根元素下所有的子元素 for (Iterator<Element> childs = rootElement.elements().iterator(); childs .hasNext();) { T element = (T) bean.newInstance();// 根据bean创建一个对象 Element child = childs.next();// 依次获取子元素 for (Field field : fields) { int mod = field.getModifiers(); if (Modifier.isFinal(mod) || Modifier.isStatic(mod) || Modifier.isPublic(mod)) { continue; } field.setAccessible(true); String attr_name = GetAttrName(bean, field);// 获取属性名 Element param = child.element(attr_name); // 根据属性名获取属性 String attr_value = param.getText();// 获取属性值 SetAttrValue(field, element, attr_value);// 设置属性值 // System.out.println("->"+attr_name+"="+attr_value); } // 判断该element是否==null? Field field_id = bean.getDeclaredField(ATTR_ID); if (field_id != null) { field_id.setAccessible(true); if (field_id.getInt(element) == NULL_ID) { elements.add(null); continue; } } elements.add(element);// 把初始化好的element添加到elements中 } } catch (SecurityException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } finally { return elements; } } /* * 将一个文件读取出来解析成列表 */ @SuppressWarnings("finally") public static <T> List<T> ReadListByFile(String path, Class<?> bean) { List<T> elements = new ArrayList<T>();// 构建一个空的list try { SAXReader saxReader = new SAXReader(); Document document = saxReader.read(new File(path)); Element rootElement = document.getRootElement();// 获取根元素 Field[] fields = bean.getDeclaredFields();// 获取此bean的所有属性 // 迭代根元素下所有的子元素 for (Iterator<Element> childs = rootElement.elements().iterator(); childs .hasNext();) { T element = (T) bean.newInstance();// 根据bean创建一个对象 Element child = childs.next();// 依次获取子元素 for (Field field : fields) { int mod = field.getModifiers(); if (Modifier.isFinal(mod) || Modifier.isStatic(mod) || Modifier.isPublic(mod)) { continue; } field.setAccessible(true); String attr_name = GetAttrName(bean, field);// 获取属性名 Element param = child.element(attr_name); ;// 根据属性名获取属性 String attr_value = param.getText();// 获取属性值 SetAttrValue(field, element, attr_value);// 设置属性值 // System.out.println("->"+attr_name+"="+attr_value); } // 判断该element是否==null? Field field_id = bean.getDeclaredField(ATTR_ID); if (field_id != null) { field_id.setAccessible(true); if (field_id.getInt(element) == NULL_ID) { elements.add(null); continue; } } elements.add(element);// 把初始化好的element添加到elements中 } } catch (Exception e) { e.printStackTrace(); } finally { return elements; } } /* * 将一个列表写入文件 */ public static <T> void WriteFileByList(String path, List<T> list, Class<?> bean) { /* * 从这里开始与ParseList是一样的 */ Document document = DocumentHelper.createDocument();// 获取document document.setXMLEncoding("UTF-8");// 设置编码 Element root = document.addElement(GetRootName(bean));// 创建根元素 Field[] fields = bean.getDeclaredFields();// 获得bean的所有属性 for (T elem : list) {// 开始迭代传入的list Element child = root.addElement(GetElemName(bean));// 创建子元素 for (Field field : fields) {// 迭代属性并且赋值 int mod = field.getModifiers(); if (Modifier.isFinal(mod) || Modifier.isStatic(mod) || Modifier.isPublic(mod)) { continue; } field.setAccessible(true);// 打破封装性 String attr_name = GetAttrName(bean, field);// 获取bean属性对应的xml文件中的名字 String attr_value = GetAttrValue(field, elem);// 获取此属性对应的值 // System.out.println(attr_name+"="+attr_value); child.addElement(attr_name).setText(attr_value);// 创建属性并赋值 } } /* * 这里就是把Parse的返回字串转化为了保存为文件而已 */ FileOutputStream fos = null; XMLWriter writer = null; try { fos = new FileOutputStream(path); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); writer = new XMLWriter(fos, format); writer.write(document); writer.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static <T> void AddElementsByList(String path, List<T> list, Class<?> bean) { SAXReader saxReader = new SAXReader(); Document document = null; try { document = saxReader.read(new File(path)); } catch (Exception e) { e.printStackTrace(); return; } Element root = document.getRootElement(); Field[] fields = bean.getDeclaredFields();// 获得bean的所有属性 for (T elem : list) {// 开始迭代传入的list Element child = root.addElement(GetElemName(bean));// 创建子元素 for (Field field : fields) {// 迭代属性并且赋值 int mod = field.getModifiers(); if (Modifier.isFinal(mod) || Modifier.isStatic(mod) || Modifier.isPublic(mod)) { continue; } field.setAccessible(true);// 打破封装性 String attr_name = GetAttrName(bean, field);// 获取bean属性对应的xml文件中的名字 String attr_value = GetAttrValue(field, elem);// 获取此属性对应的值 // System.out.println(attr_name+"="+attr_value); child.addElement(attr_name).setText(attr_value);// 创建属性并赋值 } } /* * 这里就是把Parse的返回字串转化为了保存为文件而已 */ FileOutputStream fos = null; XMLWriter writer = null; try { fos = new FileOutputStream(path); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); writer = new XMLWriter(fos, format); writer.write(document); writer.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } }
}