基于Dom4j实现javaBean转xml的功能

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

三、功能实现

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();
        //&#x83B7;&#x53D6;&#x5C5E;&#x6027;&#x7684;&#x6570;&#x7EC4;
        Field[] declaredFields = clazz.getDeclaredFields();
        //&#x6DFB;&#x52A0;&#x5B50;&#x8282;&#x70B9;,&#x5982;&#x679C;childName&#x4E3A;&#x7A7A;&#x7684;&#x8BDD;&#xFF0C;&#x5B50;&#x8282;&#x70B9;&#x9ED8;&#x8BA4;&#x7B49;&#x4E8E;&#x6839;&#x8282;&#x70B9;
        Element childElement=rootElement;
        if (null!=childName){
            childElement = rootElement.addElement(childName);
        }
        //&#x904D;&#x5386;&#x5E26;&#x8F6C;&#x6362;&#x7684;dto
        for (Field field:declaredFields){
            //&#x8BBE;&#x7F6E;&#x53EF;&#x5230;&#x8FBE;
            field.setAccessible(true);
            //&#x83B7;&#x53D6;&#x5C5E;&#x6027;&#x7684;&#x503C;
            Object fieldValue = field.get(obj);
            //&#x83B7;&#x53D6;&#x5C5E;&#x6027;&#x7684;&#x7C7B;&#x4FE1;&#x606F;
            Class fieldType = field.getType();
            //&#x4E3A;&#x7A7A;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;
            if (null==fieldValue||field.getName().equals("this$0")){
                continue;
            }
            //String
            if (fieldType.equals(String.class)){
                String name=field.getName();
                //&#x7279;&#x6B8A;&#x5B57;&#x7B26;package&#x5904;&#x7406;
                if ("package002".equals(name)){
                    name="package";
                }
                //&#x6DFB;&#x52A0;&#x5B50;&#x8282;&#x70B9;
                Element element = childElement.addElement(name);
                //&#x6DFB;&#x52A0;&#x503C;
                element.addText((String)fieldValue);
                //&#x7EE7;&#x7EED;
                continue;
            }
            //&#x5982;&#x679C;&#x6709;&#x5C5E;&#x6027;&#x7C7B;&#x578B;&#x4E3A;List
            if (fieldType.equals(List.class)&&field.getGenericType() instanceof ParameterizedType){
                //&#x83B7;&#x53D6;&#x5217;&#x8868;&#x6570;&#x636E;
                List<object> list = (List<object>)fieldValue;
                //&#x904D;&#x5386;
                for (Object childObj:list){
                    transXmlFromDTO(childObj,childElement,field.getName());
                }
                continue;
            }
            //&#x5982;&#x679C;&#x662F;Integer&#x7C7B;&#x578B;
            if (fieldValue instanceof Integer){
                //&#x6DFB;&#x52A0;&#x5B50;&#x8282;&#x70B9;
                Element element = childElement.addElement(field.getName());
                //&#x6DFB;&#x52A0;&#x503C;
                element.addText(((Integer) field.get(obj)).toString());
                continue;
            }
            //&#x5982;&#x679C;&#x4E3A;Double
            if (fieldValue instanceof Double){
                //&#x6DFB;&#x52A0;&#x5B50;&#x8282;&#x70B9;
                Element element = childElement.addElement(field.getName());
                //&#x6DFB;&#x52A0;&#x503C;
                element.addText(field.get(obj).toString());
                continue;
            }
            //&#x5BF9;&#x8C61;
            if (fieldValue instanceof ReflectDTO){
                //&#x6DFB;&#x52A0;&#x5B50;&#x8282;&#x70B9;
                transXmlFromDTO(fieldValue,childElement,field.getName());
                continue;
            }
        }
    }

</object></object></t>

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

Original: https://www.cnblogs.com/ydmysm/p/hhb_readValue.html
Author: 樱岛麻衣Ss
Title: 基于Dom4j实现javaBean转xml的功能

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610476/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java中的IO流

    IO流的分类 按照数据类型划分:字符流和字节流 按照数据流向划分:输入流和输出流 对于纯文本数据,优先使用字符流。除此之外都使用字节流。 File类 java.io.File:不能…

    Java 2023年6月9日
    074
  • 非易失性规划的原理与实现方法

    常言道,计划不如变化快。计划的制定本身就建基于对未来一定时间范围内的环境条件假设,当计划制定后到执行完成的时间段内,若环境条件发生变化,那么计划也需要进行适当的调整才能满足实际要求…

    Java 2023年6月16日
    091
  • Maven——settings.xml配置

    settings.xml配置 该settings.xml位于maven文件夹中的conf文件夹下 略过第一段注释(全是废话),看第二段注释 如第二段注释所说,配置有2处:用户配置和…

    Java 2023年6月5日
    0117
  • Linux下搭建maven(maven3.6+nexus3.2)私服

    准备maven和nexus安装包,nexus安装包好像要FQ,不然下载不到! 链接:https://pan.baidu.com/s/1bVMadGoTAK9pSLW6yBNOCg提…

    Java 2023年6月8日
    098
  • Kotlin协程解析系列(上):协程调度与挂起

    vivo 互联网客户端团队- Ruan Wen 本文是Kotlin协程解析系列文章的开篇,主要介绍Kotlin协程的创建、协程调度与协程挂起相关的内容 一、协程引入 Kotlin …

    Java 2023年6月15日
    086
  • 开发必备之单元测试

    祸乱生于疏忽 单元测试先于交付。穿越暂时黑暗的时光隧道,才能迎来系统的曙光。 单元测试的相关介绍 ​ 计算机世界里的软件产品通常是由模块组合而成的 模块又可以分成诸多子模块。 比如…

    Java 2023年6月5日
    076
  • Java相关面试题

    =与== = 属于逻辑运算符,将右侧的值赋给左侧的变量名称 ==数据关系运算符,判断左右两边的值是否相等,结果为boolean类型 &与&& &是逻…

    Java 2023年5月29日
    099
  • LeetCode 螺旋矩阵 II

    Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。 题目 螺旋矩阵 II: 给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针…

    Java 2023年6月7日
    0107
  • Linux,Centos系统下配置java Jdk(附下载地址)

    一、下载jdk 官网下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html …

    Java 2023年6月6日
    091
  • bat脚本的写法

    当你每次都要输入相同的命令时,可以把这么多命令存为一个批处理,从此以后,只要运行这个批处理,就相当于打了几行、几十行命令。下面以Nginx服务的停止脚本为例写一个bat批处理文件:…

    Java 2023年6月16日
    073
  • beanshell Sampler引入jar测试成功,JSR223 Sampler 失败记录

    同样的jar包使用beanshell Sampler可以测试,使用JSR223 Sampler报错 Java方法导出jar包,使用测试计划添加,或放入lib包,或ext包下 pub…

    Java 2023年6月8日
    079
  • RocketMQ的原理和实战!

    搭建环境 helloworld 我也不例外,直接搞起来。 一、RocketMQ的安装 1、文档 官方网站 http://rocketmq.apache.org GitHub htt…

    Java 2023年5月30日
    095
  • MyBatis 配置类详解

    核心配置文件中的标签必须按照固定的顺序: properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objec…

    Java 2023年6月7日
    071
  • 小程序接口申请和隐私文档

    谨以此文,记录我被微信开发工具折磨的这段日子 本指引是HexPal小程序开发者 (以下简称”开发者”)为处理你的个人信息而制定。 开发者处理的信息 根据法律…

    Java 2023年6月7日
    081
  • LSM-Tree:原理与介绍

    LSM Tree(log-structured merge-tree)是一种文件组织结构的数据结构,目前在不少数据库中都有使用到,如SQLite、LevelDB、HBase在Mon…

    Java 2023年6月16日
    079
  • Spring Boot:实现MyBatis分页

    综合概述 想必大家都有过这样的体验,在使用Mybatis时,最头痛的就是写分页了,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,…

    Java 2023年5月30日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球