XML工具封装类

公司通信协议一直都使用xml方式。最近中心服务更换框架。又把我原来写xml工具类修改了一下。原来是依赖jdom。现在修改成dom4j。
   正好也跟大家分享一下。至于性能我倒是没测试过。还是有点担心。主要使用的java反射机制实现。目前对List可以支持。对set,map还没实现。不过应该和list大同小异。

代码如下:
package com.megaeyes.fin.utill;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
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.Iterator;
import java.util.List;
import java.util.Set;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.dom.DOMDocument;
import org.dom4j.dom.DOMElement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.megaeyes.fin.common.Constants;
import com.megaeyes.fin.common.Message;
import com.megaeyes.fin.po.Tablet;

/**
* xml工具类,依赖于dom4j解析
*
* @author dengbin
*
*/
public class XmlUtil {

protected static final Logger logger = LoggerFactory.getLogger(XmlUtil.class);

/*========================================================解析XML==================================================================*/

/**
* xml字符串转对象
* @param xmlstr
* @param clazz 目标对象类型
* @return
*/
public static Object stringToObject(String xmlstr,Class<?> clazz){
Document doc = stringToXml(xmlstr);
    try{
            Element root = doc.getRootElement();
            @SuppressWarnings("unchecked")
Iterator<Element> iters = root.elementIterator();
            return findObject(iters,clazz);
           
    }catch(Exception e){
        e.printStackTrace();
    }
    return null;
}

/**
* xml字符串转集合
* @param xmlstr
* @param clazz list中对象类型
* @return
*/
public static List<Object> stringToList(String xmlstr,Class<?> clazz){
Document doc = stringToXml(xmlstr);
    try{
            Element root = doc.getRootElement();
            @SuppressWarnings("unchecked")
Iterator<Element> iters = root.elementIterator();
            return findList(iters,clazz);
    }catch(Exception e){
        e.printStackTrace();
    }
    return null;
}

/**
* 字符串转换成Document对象
*
* @param xmlStr
*            xml字符串
* @return Document
*/
protected static Document stringToXml(String xmlStr) {
try {
if (xmlStr == null || "".equals(xmlStr))
return null;
else {
return DocumentHelper.parseText(xmlStr);
}
} catch (Exception e) {
logger.error(e.getMessage());
return null;
}
}

/**
* 解析xml,递归需找子集
* @param iters
* @param clazz
* @return
*/
protected static Object findObject(Iterator<Element> iters,Class<?> clazz) {
Attribute  attr=null;
try {
Object object = clazz.newInstance();
while (iters.hasNext()) {
Element item = (Element) iters.next();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if(isSimpleType(field.getType())){
attr = item.attribute(field.getName());
if(attr==null)
continue;
setter(object, firstLetterToUpper(field.getName()),
attr.getValue(),
field.getType());
}else if(List.class == field.getType()){
                        ParameterizedType pt = (ParameterizedType) field.getGenericType();  
                        Class<?> childzz = (Class<?>)pt.getActualTypeArguments()[0];
                    @SuppressWarnings("unchecked")
                    Iterator<Element> children = item.elementIterator();
                    Object o =findList(children,childzz);
                    setter(object, firstLetterToUpper(field.getName()),o,field.getType());
                }else{
                    @SuppressWarnings("unchecked")
                    Iterator<Element> children = item.elementIterator();
                    System.out.println(field.getType().getCanonicalName());
                    Object o =findObject(children,field.getType());
                    setter(object, firstLetterToUpper(field.getName()),o,field.getType());
                }
}
return object;
}

} catch (Exception e) {
logger.error(e.getMessage());
}
return null;
}

/**
* 解析xml,递归需找子集
* @param iters
* @param clazz
* @return
*/
protected static List<Object> findList(Iterator<Element> iters,Class<?> clazz) {
List<Object> list = new ArrayList<Object>();
try {
while (iters.hasNext()) {
Object object = clazz.newInstance();
Element item = (Element) iters.next();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if(isSimpleType(field.getType())){
setter(object, firstLetterToUpper(field.getName()),
item.attribute(field.getName()).getValue(),
field.getType());
}else if(List.class == field.getType()){
                    ParameterizedType pt = (ParameterizedType) field.getGenericType();  
                    Class<?> childzz = (Class<?>)pt.getActualTypeArguments()[0];
                    @SuppressWarnings("unchecked")
                    Iterator<Element> children = item.elementIterator();
                    Object o =findList(children,childzz);
                    setter(object, firstLetterToUpper(field.getName()),o,field.getType());
                }else{
                    @SuppressWarnings("unchecked")
                    Iterator<Element> children = item.elementIterator();
                    Object o =findObject(children,field.getType());
                    setter(object, firstLetterToUpper(field.getName()),o,field.getType());
                }
}
list.add(object);
}
return list;

} catch (Exception e) {
logger.error(e.getMessage());
}
return null;
}





/*=============================================================封装XML================================================================*/




/**
* 对象转xml字符串
* @param obj
* @return
*/
public static String objectToString(Object obj){
Document doc = ObjectToXml(obj);
return XmlToString(doc);
}

/**
* Document对象转换成字符串
*
* @param doc
*            Document对象
* @return xml字符串
*/
protected static String XmlToString(Document doc) {
if (doc == null)
return null;
else
return doc.asXML();
}




/**
* 对象转换成Document,spring已包含类似功能
*
* @param object
*            对象
* @param scheme
*            模式
* @param nodeType
*            节点名称类型
* @return Document
*/
protected static Document ObjectToXml(Object object) {
if (object == null)
return null;
else {
Document doc = new DOMDocument();
if (object instanceof List) {
for (Object obj : (List<?>) object) {
findObject(doc, obj);
}
} else if (object instanceof Set) {
for (Object obj : (Set<?>) object) {
findObject(doc, obj);
}
} else {
findObject(doc, object);
}
return doc;
}
}

/**
* 组装xml
* @param root
* @param object
*/
protected static void findObject(Document root, Object object) {
Class<?> clazz = object.getClass();
Field[] fields = clazz.getDeclaredFields();
Element element=null;
element= new DOMElement(clazz.getSimpleName());
for (Field field : fields) {
parseChildren(field, element, object);
}
root.add(element);
}

@SuppressWarnings("deprecation")
protected static void parseChildren(Field field, Element element, Object object) {
Class<?> type = field.getType();
if (isSimpleType(type)) {
try{
element.setAttributeValue(
field.getName(),
toString(getter(object, firstLetterToUpper(field.getName()))));
}catch(Exception e){}
} else {
try {
Object child = getter(object,
firstLetterToUpper(field.getName()));
if(child instanceof List){
for(Object obj : (List<?>)child){
Element chidElelment= new DOMElement(obj.getClass().getSimpleName());
Field[] fields = obj.getClass().getDeclaredFields();
for (Field chidField : fields) {
parseChildren(chidField, chidElelment, obj);
}
element.add(chidElelment);
}

}else{
if (child != null) {
Element chidElelment =null;
chidElelment= new DOMElement(child.getClass().getSimpleName());
Field[] chidFields = child.getClass().getDeclaredFields();
for (Field chidField : chidFields)
parseChildren(chidField, chidElelment, child);
element.add(chidElelment);
}
}

} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage());
}
}
}



/*===============================================================公用方法================================================================*/

/**
* 简单数据类型判断
* @param type 数据类型
* @return
*/
protected static boolean isSimpleType(Class<?> type){
if (type == String.class
|| type == int.class || type == Integer.class
|| type == double.class || type == Double.class
|| type == char.class || type == Character.class
|| type == long.class || type == Long.class
|| type == float.class || type == Float.class
|| type == byte.class || type == Byte.class
|| type == boolean.class || type == Boolean.class
|| type == short.class || type == Short.class
|| type==Date.class) {
return true;
}else{
return false;
}
}

/**
* 调用对象的属性get方法
*
* @param obj
* @param att
* @return
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
protected static Object getter(Object obj, String att) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Method method = obj.getClass().getMethod("get" + att);
return method.invoke(obj);
}

/**
* 调用对象属性的set方法
*
* @param obj
* @param att
* @param value
* @param type
*/
protected static void setter(Object obj, String att, Object value, Class<?> type) {
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sss");
try {
Method method = obj.getClass().getMethod("set" + att, type);
if (type == String.class)
method.invoke(obj, toString(value));
else if (type == Integer.class || type == int.class)
method.invoke(obj, toInteger(value));
else if (type == double.class || type == Double.class)
method.invoke(obj, toDouble(value));
else if(type == char.class || type == Character.class)
method.invoke(obj,toCharacter(value));
else if(type == long.class || type == Long.class)
method.invoke(obj,toLong(value));
else if(type == float.class || type == Float.class)
method.invoke(obj,toFloat(value));
else if(type == byte.class || type == Byte.class)
method.invoke(obj,toByte(value));
else if(type == boolean.class || type == Boolean.class)
method.invoke(obj,toBoolean(value));
else if(type == short.class || type == Short.class)
method.invoke(obj,toShort(value));
else if(type == java.util.Date.class){
    method.invoke(obj, df.parse(String.valueOf(value)));
}
else
method.invoke(obj,value);
} catch (Exception e) {
logger.error(e.getMessage());
}
}



/**
* 首字母大写
*
* @param str
* @return
*/
protected static String firstLetterToUpper(String str) {
char[] array = str.toCharArray();
array[0] -= 32;
return String.valueOf(array);
}

/**
* 首字母小写
*
* @param str
* @return
*/
protected static String firstUpperToLetter(String str) {
char[] array = str.toCharArray();
array[0] += 32;
return String.valueOf(array);
}

/**
* 对象转换成字符串
*
* @param object
* @return
*/
protected static String toString(Object object) {
if (object == null)
return "";
else
return object.toString();
}

/**
* 对象转换成整形
*
* @param object
* @return
*/
protected static Integer toInteger(Object object) {
String str = toString(object);
if ("".equals(str))
return 0;
else
return Integer.parseInt(str);
}

/**
* 对象转换成double
* @param object
* @return
*/
protected static Double toDouble(Object object){
String str = toString(object);
if("".equals(str))
return 0.0;
else
return Double.parseDouble(str);
}

/**
* 对象转换成float
* @param object
* @return
*/
protected static Float toFloat(Object object){
String str = toString(object);
if("".equals(str))
return 0.0f;
else
return Float.parseFloat(str);
}

/**
* 对象转换成long
* @param object
* @return
*/
protected  static Long toLong(Object object){
String str = toString(object);
if("".equals(str))
return 0l;
else
return Long.parseLong(str);
}

/**
* 对象转换成booean
* @param object
* @return
*/
protected static Boolean toBoolean(Object object){
String str = toString(object);
if("".equals(str))
return true;
else
return Boolean.parseBoolean(str);
}

/**
* 对象转换成short
* @param object
* @return
*/
protected static Short toShort (Object object){
String str = toString(object);
if("".equals(str))
return 0;
else
return Short.parseShort(str);
}

/**
* 对象转换成byte
* @param object
* @return
*/
protected static Byte toByte(Object object){
String str = toString(object);
if("".equals(str))
return 0;
else
return Byte.parseByte(str);
}

/**
* 对象转换成char
* @param object
* @return
*/
protected static Character toCharacter(Object object){
if(object==null)
return '\u0beb';
else
return (Character) object;
}


}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值