`

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; 



}

分享到:
评论

相关推荐

    一次代码重构之旅-快速读写xml文件工具类封装

    在描述中提到的博客文章“一次代码重构之旅-快速读写xml文件工具类封装”,作者分享了如何通过Java进行XML操作的优化,将原始的XML处理代码整合到一个工具类中,提供简洁易用的API。在阅读该博客文章的过程中,我们...

    java一键xml转map,一键map转xml工具类

    本文将详细讲解如何使用Java实现XML到Map以及Map到XML的一键转换,并介绍一个已封装好的工具类`EasyXmlUtil`。 首先,XML到Map的转换涉及到XML的解析。在Java中,我们可以使用`javax.xml.parsers....

    java常用工具类封装

    "java常用工具类封装"是指将常见的功能如线程管理、数据解析、第三方库集成等进行封装,以提高代码的可重用性和可维护性。下面我们将深入探讨这些知识点: 1. **线程池**: Java中的线程池是由`java.util....

    XML文件解析封装工具类

    本篇将详细讲解基于Java的XML文件解析与封装工具类的实现,以及相关的核心知识点。 首先,我们有两个关键的文件:`XmlObject.java` 和 `XmlParser.java`。`XmlObject.java` 可能是用于表示Java对象的类,而`Xml...

    Redis操作字符串工具类封装,Redis工具类封装

    在Java开发中,为了方便与Redis进行交互,通常会封装一个工具类,本文将详细介绍如何封装一个基于Redis操作字符串的工具类。 在`RedisPoolUtils`这个类中,我们可以看到它是对Jedis或Lettuce等Redis客户端的进一步...

    基于tinyxml2的xml操作库再封装

    总结来说,"基于tinyxml2的xml操作库再封装"项目为C++开发者提供了一个高效、易用的XML处理工具,通过优化和扩展tinyxml2的功能,使得XML数据的处理变得更加直观和便捷。这将极大地提高开发效率,降低开发成本,尤其...

    java通用解析XML工具类

    在实际开发中,我们可以根据需求选择适合的解析方式,并将其封装为工具类。例如,可以创建一个XMLUtil类,包含上述三种解析方法,并提供统一的接口供外部调用。同时,还可以添加XML的序列化功能,即把Java对象转换为...

    Linq处理xml的工具类

    Linq处理xml的工具类 处理Xml文档的封装 包含了linq处理xml的基本操作

    json和xml工具类

    本篇文章将深入探讨如何使用自定义的工具类`AppUtil`来简化JSON和XML的生成过程。 首先,JSON是一种轻量级的数据交换格式,它基于JavaScript语法,但独立于语言,易于人阅读和编写,同时也易于机器解析和生成。JSON...

    javascript封装的通用解析和操作xml文件数据工具类(含测试使用代码)

    javascript封装的通用解析和操作xml文件数据工具类(含测试使用代码) javascript封装的通用解析和操作xml文件数据工具类(含测试使用代码) 测试数据: &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;root&gt; &lt;book&gt; ...

    微信支付工具类--封装全部微信支付工具类

    微信支付工具类是一系列用于处理微信支付业务的Java类,它们封装了与微信支付接口交互的逻辑,使得开发者能够更方便地集成微信支付功能到自己的应用程序中。以下是对这些类的功能和作用的详细说明: 1. **WXPay....

    C++XML读写封装类

    总之,"C++XML读写封装类"是C++开发中一个实用的工具,它简化了XML操作,提高了代码的可读性和可维护性。通过理解和使用这样的封装类,开发者可以更高效地处理XML数据,无论是在配置文件、数据交换还是序列化等方面...

    XMLHelper 封装类

    "XMLHelper 封装类"是针对XML操作进行封装的一个工具类,旨在简化XML的读写操作,提高开发效率。以下将详细介绍XMLHelper类可能包含的功能和使用方法。 1. **XML解析**:XMLHelper可能包含了对XML文档的解析功能,...

    gson解析工具类封装

    本文将深入探讨如何封装一个Gson解析工具类,以优雅地处理JSON数据,尤其是避免在解析过程中遇到`String`为`null`时产生的错误。 首先,我们需要引入Gson库。如果你的项目是Maven项目,可以在pom.xml文件中添加以下...

    tinyxml类封装库

    数据表格以XML格式存储在XML文档中,通过tinyxml工具解析XML来读取数据库,然后在MFC可编辑表格中实现数据的添加、删除、查询,最后通过重新组装XML格式文档来保存数据库。 特点:不依赖ACCESS数据库和SQL SEVER等...

    AFN网络请求封装工具类

    **AFNetworking网络请求封装工具类详解** 在iOS应用开发中,网络请求是不可或缺的一部分,而AFNetworking作为一款强大的网络请求库,被广泛应用于各种项目之中。本篇文章将深入解析一个基于AFNetworking封装的网络...

    xml转对象封装的简单与复杂xml的转化写法

    描述中的其他两个工具类可能包含了处理这些复杂情况的代码,但具体实现需要根据实际XML结构进行调整。 5. **自定义转换逻辑**:在处理复杂XML时,可能需要编写自定义的转换逻辑。例如,当XML节点对应于Java对象的...

    jython对XML的处理,封装成了工具类

    在本案例中,我们讨论的是一个使用Jython来处理XML的工具类,该类封装了一些基本的DOM4J操作,提供了对XML文档的解析和操作功能。 DOM4J是一个强大的Java XML API,它提供了灵活且高效的DOM、SAX和StAX接口,使得...

    对分页进行了封装,PageUtil.java工具类

    这里提到的"对分页进行了封装,PageUtil.java工具类"是一个Java实现的分页辅助类,它的主要目标是简化分页查询的操作,提供更便捷的API给开发者使用。 `PageUtil.java`工具类可能包含了以下功能: 1. **参数处理**...

    XML类(VS2005下C++封装的通用XML类,并附使用说明)

    总的来说,C++封装的XML类在VS2005环境下提供了便利的XML操作工具,使得XML编程变得更加简单和高效。通过深入理解XML类的设计和实现,你可以更好地利用这个工具,提升软件项目的开发效率和质量。

Global site tag (gtag.js) - Google Analytics