基于Dom4j实现javaBean转xml的功能

Posted 樱岛麻衣Ss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Dom4j实现javaBean转xml的功能相关的知识,希望对你有一定的参考价值。

一、前言
前面实现了xml转javaBean的功能,今天继续完成javaBean转xml的功能。这一块实现的比较早
现在看来可能有很多可以优化的地方(也说明了我有成长)

二、 公共方法还是ReflectDTO
作用和前面一样也是标识作用,如有问题请移步之前面一章
https://www.cnblogs.com/ydmysm/p/hhb_parseXml.html

三、功能实现

3.1、基础功能。 主要是生成Dom4j的Document对象,解码格式、根节点

    private static final String XML_ENCODING="UTF-8";
    //请求一级结点
    private static final String REQUEST_ROOT_NODE="request";
    //返回一级结点
    private static final String RESPONSE_ROOT_NODE="response";


  /**
     * 构造xml格式
     * @param o
     * @return
     */
    public static String buildRequestXml(Object o){
        //生成头部信息
        Document document = generateRootNode();
        //添加根节点
        Element element = document.addElement(REQUEST_ROOT_NODE);
        //构造子结点
        buildXml(o,element);
        //返回
        try {
            return new String(document.asXML().getBytes(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new BadRequestAlertException("不支持的编码格式");
        }
    }

    private static void buildXml(Object o,Element root){
        //生成子结点
        try {
            //递归构造ducument
            transXmlFromDTO(o,root,null);
        } catch (IllegalAccessException e) {
            throw new BadRequestAlertException("对象转XML格式失败");
        }
    }

    private static Document generateRootNode(){
        //生成头部
        Document xml= DocumentHelper.createDocument();
        //设置解码格式
        xml.setXMLEncoding(XML_ENCODING);
        //添加一级结点--request
        return xml;
    }

3.2、核心方法,递归实现Document的构造,根据属性类型进行不同的处理方法。


    /**
     * 请求对象转XML
     * @param obj
     * @param rootElement
     * @param childName
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    private static <T> void transXmlFromDTO(Object obj,Element rootElement,String childName) throws IllegalAccessException {
        Class clazz = obj.getClass();
        //获取属性的数组
        Field[] declaredFields = clazz.getDeclaredFields();
        //添加子节点,如果childName为空的话,子节点默认等于根节点
        Element childElement=rootElement;
        if (null!=childName){
            childElement = rootElement.addElement(childName);
        }
        //遍历带转换的dto
        for (Field field:declaredFields){
            //设置可到达
            field.setAccessible(true);
            //获取属性的值
            Object fieldValue = field.get(obj);
            //获取属性的类信息
            Class fieldType = field.getType();
            //为空直接返回
            if (null==fieldValue||field.getName().equals("this$0")){
                continue;
            }
            //String
            if (fieldType.equals(String.class)){
                String name=field.getName();
                //特殊字符package处理
                if ("package002".equals(name)){
                    name="package";
                }
                //添加子节点
                Element element = childElement.addElement(name);
                //添加值
                element.addText((String)fieldValue);
                //继续
                continue;
            }
            //如果有属性类型为List
            if (fieldType.equals(List.class)&&field.getGenericType() instanceof ParameterizedType){
                //获取列表数据
                List<Object> list = (List<Object>)fieldValue;
                //遍历
                for (Object childObj:list){
                    transXmlFromDTO(childObj,childElement,field.getName());
                }
                continue;
            }
            //如果是Integer类型
            if (fieldValue instanceof Integer){
                //添加子节点
                Element element = childElement.addElement(field.getName());
                //添加值
                element.addText(((Integer) field.get(obj)).toString());
                continue;
            }
            //如果为Double
            if (fieldValue instanceof Double){
                //添加子节点
                Element element = childElement.addElement(field.getName());
                //添加值
                element.addText(field.get(obj).toString());
                continue;
            }
            //对象
            if (fieldValue instanceof ReflectDTO){
                //添加子节点
                transXmlFromDTO(fieldValue,childElement,field.getName());
                continue;
            }
        }
    }

四、结束
这里是我的一些使用心得,如果能够帮到大家我非常荣幸。也开心有朋友提出相关优化或者更好的实现一起学习,
共同进步。(直接调用api的就不用了)

以上是关于基于Dom4j实现javaBean转xml的功能的主要内容,如果未能解决你的问题,请参考以下文章

XML 转 JSON

JAVA bean与XML互转的利器---XStream

Dom4J XML转bean

xml 转map dom4j

day02-Spring基本介绍02

java字符串利用dom4j转 xml 且遍历