`

用于pojo 转换为xml字符串 的工具类

 
阅读更多
import java.io.IOException;
import java.io.StringReader;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import javax.xml.parsers.ParserConfigurationException;


import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.codehaus.jackson.map.util.BeanUtil;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.dom.DOMDocumentFactory;
import org.dom4j.dom.DOMElement;
import org.dom4j.io.SAXReader;

/**
 * @Description:
 *	 class description
 * Revision History:
 * DATE AUTHOR VERSION DESCRIPTION
 *
 * 用于pojo 转换为xml字符串 的工具类
 * @createDate 2013-10-14
 * @since gdcams V01.00.000
 */
public class XmlUtils {

    @SuppressWarnings("rawtypes")
    public static String pojoToXml(Object obj,String rootName) throws SecurityException, NoSuchFieldException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        Document document=DOMDocumentFactory.getInstance().createDocument();
        if(obj!=null ){
            if(isArray(obj)){
                Element root=getElement(obj, rootName);
                for(Object pojo:(Object[])obj){
                    root.add(pojoToElelment(pojo,null));
                }
                document.setRootElement(root);
            }else if(isCollection(obj)){
                Element root=getElement(obj, rootName);
                for(Object pojo:(Collection) obj){
                    root.add(pojoToElelment(pojo,null));
                }
                document.setRootElement(root);
            }else{
                document.setRootElement(pojoToElelment(obj,rootName));
            }
        }
        return document.asXML();
    }

    /**
     * @param xml
     * @param pojoClass
     * @param name
     * @return
     * @throws DocumentException
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @throws NoSuchMethodException
     * @throws InvocationTargetException
     * @throws NoSuchFieldException
     * @throws SecurityException
     */
    @SuppressWarnings("unchecked")
    public static <T> List<T> xmlToPojo(String xml,Class<T> pojoClass,String name) throws DocumentException, InstantiationException, IllegalAccessException, SecurityException, NoSuchFieldException, InvocationTargetException, NoSuchMethodException {
        SAXReader saxReader=new SAXReader();
        Document document=saxReader.read(new StringReader(xml));
        name=getName(pojoClass, name);

        if(document.getRootElement().getName().equals(name)){
            List<T> result=new ArrayList<T>();
            result.add(elementToPojo(document.getRootElement(), pojoClass));
            return result;
        }

        List<Element> data=document.getRootElement().elements(name);
        List<T> result=new ArrayList<T>();
        for(Element ele:data){
            result.add(elementToPojo(ele, pojoClass));
        }

        return result;

    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    private static <T> T elementToPojo(Element ele,Class<T> pojoClass) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchFieldException, InvocationTargetException, NoSuchMethodException{
        if(ele==null)
            return null;
        T pojo=pojoClass.newInstance();
        for(String name : getPropertyNames(pojo)){
            Field field=pojoClass.getDeclaredField(name);
            Class cls=field.getType();
            String pName=getName(cls, name);
            Annotation ann=null;
            if(field.getAnnotation(Value.class)!=null){
                Object value=ConvertUtils.convert(ele.getText(), cls);
                PropertyUtils.setProperty(pojo, name,value);
            }else if(field.getAnnotation(Attribute.class) !=null){
                org.dom4j.Attribute atr=ele.attribute(name);
                if(atr!=null){
                    Object value=ConvertUtils.convert(atr.getValue(), cls);
                    PropertyUtils.setProperty(pojo, name,value);
                }
            }else if((ann=field.getAnnotation(CollectionOrArray.class)) !=null){
                Element ee=ele.element(pName) ;
                if(ee!=null){
                    Class _cls=((CollectionOrArray)ann).cls();
                    List<Element> es=ee.elements(getName(_cls,""));
                    List data=new ArrayList();
                    for(Element e: es){
                        data.add(elementToPojo(e, _cls));
                    }
                    if(cls.isArray()){
                        PropertyUtils.setProperty(pojo, name,data.toArray());
                    }else{
                        PropertyUtils.setProperty(pojo, name,data);
                    }
                }


            }else if( (ann=field.getAnnotation(ValueList.class)) !=null){
                Class _cls=((ValueList)ann).cls();
                List data=new ArrayList();
                List<Element> es=ele.elements(getName(_cls,""));
                for(Element e: es){
                    data.add(elementToPojo(e, _cls));
                }
                PropertyUtils.setProperty(pojo, name,data);
            }else if(isBaseType(cls)){
                Object value=ConvertUtils.convert(ele.elementText(name), cls);
                PropertyUtils.setProperty(pojo, name,value);
            }else {
                Object value=elementToPojo(ele.element(pName), cls);
                PropertyUtils.setProperty(pojo, name,value);
            }
        }
        return pojo;
    }



    /**具体的pojo 转换为xml 元素
     * @param pojo
     * @param pName
     * @return
     * @throws SecurityException
     * @throws NoSuchFieldException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     * @throws NoSuchMethodException
     */
    @SuppressWarnings("rawtypes")
    private static Element pojoToElelment(Object pojo,String pName) throws SecurityException, NoSuchFieldException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
        if(pojo==null )
            return null;

        pName=getName(pojo,pName);
        Class cls=pojo.getClass();	//获取元素类型
        Element ele = getElement(pojo,pName);	//获取元素



        for(String name : getPropertyNames(pojo)){	//遍历所有属性
            Object _pojo=PropertyUtils.getProperty(pojo, name);
            Field field=cls.getDeclaredField(name);

            if(_pojo==null ){	//如果该属性为空 不设置此属性相关信息
                continue;
            }else if( field.getAnnotation(Disabled.class) !=null){//如果该属性设置注解 Disabled 不设置此属性相关信息
                continue;
            }else if( field.getAnnotation(Value.class) !=null ){//注解Value 转换为 text
                ele.setText(String.valueOf(_pojo));
            }else if( field.getAnnotation(Attribute.class) !=null ){
                ele.addAttribute(name,String.valueOf(_pojo));
            }else if( field.getAnnotation(ValueList.class) !=null){
                for(Object obj:(Collection)_pojo){
                    addElement(ele,pojoToElelment(obj,null));
                }
            }else if( field.getAnnotation(CollectionOrArray.class) !=null){
                Element _ele=getElement(_pojo, name);
                addElement(ele,_ele);
                if(isArray(_pojo)){
                    for(Object obj:(Object[])_pojo){
                        addElement(_ele,pojoToElelment(obj,null));
                    }
                }else if(isCollection(_pojo)){
                    for(Object obj:(Collection)_pojo){
                        addElement(_ele,pojoToElelment(obj,null));
                    }
                }
            }else if(isBaseType(_pojo)){
                addElement(ele,getElement(_pojo, name));
            } else{
                addElement(ele,pojoToElelment(_pojo,name));
            }
        }

        return ele;
    }

    private static String getName(Object pojo,String pName){
        return getName(pojo.getClass(),pName);
    }
    @SuppressWarnings({ "unchecked", "rawtypes" })
    private static String getName(Class pojoClass,String pName){
        if(pName==null||pName.trim().length()==0){//不设置元素名称 取类名为默认名称
            Annotation ann=pojoClass.getAnnotation(Name.class);
            Name name=(Name)ann;
            if(name!=null && name.value()!=null && name.value().trim().length()!=0){
                return name.value();
            }
            return pojoClass.getSimpleName();
        }
        return pName;
    }
    /**元素增加子元素 增加了为空判断 使其不会报错
     * @param parent
     * @param child
     * @return
     */
    private static Element addElement (Element parent,Element child){
        if(parent==null )
            return parent;
        if(child==null)
            return parent;
        parent.add(child);
        return parent;
    }

    /**判断对象是否基本类型 (包括 number string date)
     * @param pojo
     * @return
     */
    public static boolean isBaseType(Object pojo){
        if(pojo==null)
            return false;
        return pojo.getClass().isPrimitive() || pojo instanceof Number || pojo instanceof String || pojo instanceof Date;
    }

    @SuppressWarnings("rawtypes")
    public static boolean isBaseType(Class pojoClass){
        if(pojoClass==null)
            return false;
        return pojoClass.isPrimitive() || Number.class.equals(pojoClass.getSuperclass()) || String.class.equals(pojoClass) || Date.class.equals(pojoClass);
    }
    /**判断对象是否是集合或数组类型
     * @param pojo
     * @return
     */
    public static boolean isCollectionOrArray(Object pojo){
        if(pojo==null)
            return false;
        return isCollection(pojo) || isArray(pojo);
    }

    /**判断对象是否是集合类型
     * @param pojo
     * @return
     */
    public static boolean isCollection(Object pojo){
        if(pojo==null)
            return false;
        return (pojo instanceof Collection) ;
    }
    /**判断对象是否是数组类型
     * @param pojo
     * @return
     */
    public static boolean isArray(Object pojo){
        if(pojo==null)
            return false;
        return pojo.getClass().isArray() ;
    }

    /**根据pojo 与 名称 创建xml元素 不设置元素名称 取类名为默认名称
     * @param pojo
     * @param name
     * @return
     */
    private static Element getElement(Object pojo,String name){
        if(pojo==null)
            return null;
        if(name==null)
            name=pojo.getClass().getSimpleName();
        Element ele=new DOMElement(name);
        if(isBaseType(pojo)){
            if(pojo!=null)
                ele.setText(String.valueOf(pojo));
        }
        return ele;
    }

    public static java.util.Map describe(Object pojo){
        if(pojo==null)
            return new HashMap(0);
        try {
            Map<String,Object> map= BeanUtils.describe(pojo);
            map.remove("class");
            return map;
        } catch (Exception e) {
            return new HashMap(0);
        }

    }

    public static Collection<String> getPropertyNames(Object pojo){
        return describe(pojo).keySet();
    }

}


public @interface Attribute {
}

public @interface CollectionOrArray {

    Class cls();
}

public @interface Disabled {
}

public @interface Name {

    String value();
}

public @interface Value {
}

public @interface ValueList {

    Class cls();
}


 

 

分享到:
评论

相关推荐

    parse xml string from url to POJO

    3. **将XML字符串转换为POJO**: 一旦有了XML字符串,就需要解析它并映射到Java对象。这里可以使用如`Jackson`,`Gson`或`SimpleXML`等库。对于XML,`SimpleXML`是一个不错的选择,因为它可以直接将XML元素映射到...

    使用xstream解析xml,xml与pojo的双向转化,完整的java 工程

    4. 序列化:将Java对象转化为XML字符串。使用`XStream.toXML()`方法,传入要转化的对象即可。 5. 反序列化:将XML字符串转化为Java对象。调用`XStream.fromXML()`方法,传入XML字符串,返回对应类型的Java对象。 6...

    JSON后台相互转换.docx

    例如,JsonUtil工具类提供了getObject4JsonString方法,可以将JSON字符串转换为Java对象。 ```java public static Object getObject4JsonString(String jsonString, Class pojoClass) { JSONObject jsonObject = ...

    json、javaBean、xml互转的几种工具介绍

    Gson是由Google提供的一个开源库,它可以将Java对象转换为JSON字符串,反之亦然。使用Gson,你可以轻松地在JavaBean和JSON之间进行转换。例如: ```java MyClass myObj = new MyClass(); String jsonString = ...

    XmlUtil.java

    xml格式字符串与java pojo实体类相互转换工具类

    实体类反射非空赋值,AjaxJson工具类

    在“实体类反射非空赋值,AjaxJson工具类”这个主题中,我们将探讨如何使用反射来安全地为实体类的属性赋值,并结合Ajax与JSON进行数据的转换和交互。 首先,让我们深入了解反射的概念。Java反射API提供了Class类,...

    json-lib-v2.4

    例如,`XMLUtils.toJSON()`可以将XML字符串转化为JSON格式,而`JSONObject.toXML()`则可以将JSON对象转换为XML字符串。 4. **复杂类型的处理**:除了基本类型和简单对象,`json-lib`还可以处理包括日期、数组、集合...

    jackson工具类

    Jackson的核心功能在于将Java对象转换成JSON字符串(序列化)和将JSON字符串转换回Java对象(反序列化)。`ObjectMapper`是实现这一功能的关键类。通过`writeValueAsString()`方法可以将Java对象序列化为JSON,而`...

    json-lib-2.1

    "json-lib-2.1"就是这样一个库,专为Java开发者设计,用于方便地将Java集合、数组、POJO(Plain Old Java Object)等数据结构转换为JSON格式,同时也能将JSON字符串反序列化回对应的Java对象。这个库特别适用于与...

    eclipse中castor插件

    - 序列化和反序列化:使用Castor提供的API,可以将Java对象转换为XML字符串,或将XML文档解析为Java对象。 4. **使用Castor进行数据绑定的优势**: - 提高开发效率:通过自动化的映射,减少了手动处理XML数据的...

    反射入门小练习

    然后,我们可以使用`toXML()`方法将对象转换为XML字符串,`fromXML()`方法则将XML字符串恢复为对象。这样,我们可以通过比较序列化前后的对象状态来确认反射设置的初始值是否正确。 ```java XStream xstream = new ...

    java解析json文件Jar包

    7. **org.apache.commons.lang3**: 这个库可能包含了一些通用的Java工具类,虽然不是直接用于JSON处理,但在处理JSON时可能会用到,比如字符串操作、类型转换等。 在Java工程中引入这些Jar包后,开发者可以轻松地在...

    json-jar包

    2. **commons-lang-2.5.jar**:Apache Commons Lang是另一个Apache项目,它提供了一些Java语言核心类的扩展,包括字符串处理、日期和时间操作、数学函数以及反射辅助工具等。在处理JSON时,这个库可能用于字符串格式...

    TaggedModularConfigurationJava配置库读取并将配置文件映射到POJO

    TMC库会自动处理类型转换,例如将字符串转换为整数或日期等。 5. **加载和使用配置**:在应用程序启动时,通过TMC库加载配置。加载后的配置对象可以直接在代码中使用,无需再进行手动解析。 6. **动态刷新**:TMC...

    jackson.jar

    通过`readValue()`方法,可以将JSON字符串或输入流转换为指定类型的Java对象,如POJO(Plain Old Java Object)。 3. **注解支持**: Jackson.annotations模块提供了各种注解,如`@JsonProperty`、`@JsonInclude`和`...

    json-lib最新版本 含源码

    `XMLSerializer`类可以将XML字符串转换为JSON,反之亦然。 6. **JSONPath支持**:类似于XPath在XML中的作用,`json-lib`实现了JSONPath,允许开发者通过路径表达式来查询和修改JSON数据。 7. **性能优化**:`json-...

    serializepojo:能够以CSV格式序列化简单pojo的库

    3. 序列化:创建一个`serializepojo`库提供的类实例,然后传入要序列化的POJO对象,调用相应的方法将其转换为CSV字符串。 4. 处理结果:生成的CSV字符串可以直接写入文件,通过网络发送,或者进一步处理,如分析或...

    jackson的jar包

    1. **Jackson-databind**:这是Jackson最核心的部分,提供了将Java对象转换为JSON字符串和从JSON字符串反序列化回Java对象的功能。它包含`ObjectMapper`类,是Jackson的主要工作接口,能够进行复杂的序列化配置和...

    xml2json:xml到json随处可见; 原始

    `XmlMapper`用于从XML文件中读取数据,将其映射到Java对象,然后`jsonMapper`将这个Java对象转换成JSON字符串。 在实际应用中,XML到JSON的转换可能需要处理更复杂的情况,例如处理命名空间、处理XML注释、处理XML...

    json-lib及相关jar包

    1. **对象到JSON的序列化**:可以将Java对象,如POJO(Plain Old Java Object)、集合、数组等转换为JSON字符串。例如,`JSONArray.fromObject()` 和 `JSONObject.fromObject()` 方法用于将Java对象转换为JSON数组或...

Global site tag (gtag.js) - Google Analytics