基于Dom4J实现XML快速解析(三)

XMLParse之XML文件生成实现

前面实现了XML的设计和文件解析,对于XML文件的生成,原理依然是按照反射机制,将XML标签类实例逆向保存到dom4j.jar中的Element中,对照前面两篇文章,实现并不困难

思路分析

通过反射取到XML标签类中的各个变量的类型和值。
遇到List或者非属性对象需要创建新的标签元素。使用addElement()方法实现添加新的节点。
遇到StringIntegerFloatBoolean直接添加到当前元素的属性中即可

XmlGenerate.java中定义的write()方法为具体实现。
上代码:

private static void write(Element rootElement, Object object) throws InvocationTargetException, IllegalAccessException {

        Class<? extends Object> clazz = object.getClass();
        Field[] filds = clazz.getDeclaredFields();
        Method[] methods = clazz.getDeclaredMethods();
        for (Field fild : filds) {
            String type = fild.getGenericType().toString();
            String name;
            if (type.contains(".List")){//子节点 集合

                name = fild.getGenericType().toString();
                name = name.substring(name.lastIndexOf(".")+1,name.length()-1);
                for (Method method : methods) {
                    if (("get"+name.toLowerCase()+"s").equals(method.getName().toLowerCase())){
                        List list = (List) method.invoke(object);
                        if (list != null){
                            for (Object o : list) {
                                Element element = rootElement.addElement(name);
                                write(element,o);
                            }
                        }
                    }
                }
                System.out.println(fild.getName());
                System.out.println(fild.getType());
                System.out.println(fild.getDeclaringClass());
                System.out.println(fild.getGenericType());

            }else if (type.contains(".String")){//属性

                name = fild.getName();
                for (Method method : methods) {
                    String mName = method.getName();
                    if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
                        String s = (String) method.invoke(object);
                        if (s == null)
                            s = " ";
                        rootElement.addAttribute(fild.getName(),s);
                    }
                }


            }else if (type.contains(".Integer")){
                name = fild.getName();
                for (Method method : methods) {
                    String mName = method.getName();
                    if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
                        Integer s = (Integer) method.invoke(object);
                        rootElement.addAttribute(fild.getName(),s+"");
                    }
                }
            }else if (type.contains(".Float")){
                name = fild.getName();
                for (Method method : methods) {
                    String mName = method.getName();
                    if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
                        Float s = (Float) method.invoke(object);
                        rootElement.addAttribute(fild.getName(),s+"");
                        System.out.println("name"+fild.getName()+" value "+s);
                    }
                }
            }else if(type.contains(".Boolean")){
                name = fild.getName();
                for (Method method : methods) {
                    String mName = method.getName();
                    if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
                        Boolean s = (Boolean) method.invoke(object);
                        rootElement.addAttribute(fild.getName(),s+"");
                        System.out.println("name"+fild.getName()+" value "+s);
                    }
                }
            }else {//子节点 非集合

                name = fild.getGenericType().toString();
                name = name.substring(name.lastIndexOf(".")+1);
                for (Method method : methods) {
                    String mName = method.getName();
                    if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
                        Object obj = method.invoke(object);//获得子标签
                        if (obj!=null){
                            Element element = rootElement.addElement(name);
                            write(element,obj);
                        }
                    }
                }

            }
        }
    }

generate 生成XML文件

封装在XMLAPI.java文件中,writeObj2Xml()方法,只需要传入XML标签类实例和输出路径就可以生成XML文件。在writeObj2Xml()中调用了XmlGenerate.generate()

/**
     * Generate.
     *
     * @param object 数据源,待转化成xml的实体类
     * @param DesPath xml文件生成路径
     * @throws InvocationTargetException the invocation target exception
     * @throws IllegalAccessException    the illegal access exception
     * @throws IOException               the io exception
     */
    public static void generate(Object object,String DesPath)throws InvocationTargetException, IllegalAccessException, IOException {
        String name;
        Class<?> clazz = object.getClass();
        String rootname = clazz.getName();
        rootname = rootname.substring(rootname.lastIndexOf(".")+1);
        System.out.println(rootname);
        Field[] filds = clazz.getDeclaredFields();
        Method[] methods = clazz.getDeclaredMethods();
        Element root = DocumentHelper.createElement(rootname);
        // 创建文档并设置文档的根元素节点
        Document doucment = DocumentHelper.createDocument(root);

        for (Field fild : filds) {
            String type = fild.getGenericType().toString();
            if (type.contains(".String")){
                name = fild.getName();
                for (Method method : methods) {
                    String mName = method.getName();
                    if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
                        String s = (String) method.invoke(object);
                        if (s == null)
                            s = "";
                        root.addAttribute(fild.getName(),s);
                        System.out.println("name"+fild.getName()+" value "+s);
                    }
                }
            }else  if (type.contains(".Integer")){
                name = fild.getName();
                for (Method method : methods) {
                    String mName = method.getName();
                    if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
                        Integer s = (Integer) method.invoke(object);
                        root.addAttribute(fild.getName(),s+"");
                    }
                }
            }else if (type.contains(".Float")){
                name = fild.getName();
                for (Method method : methods) {
                    String mName = method.getName();
                    if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
                        Float s = (Float) method.invoke(object);
                        root.addAttribute(fild.getName(),s+"");
                        System.out.println("name"+fild.getName()+" value "+s);
                    }
                }
            }else if(type.contains(".Boolean")){
                name = fild.getName();
                for (Method method : methods) {
                    String mName = method.getName();
                    if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
                        Boolean s = (Boolean) method.invoke(object);
                        root.addAttribute(fild.getName(),s+"");
                        System.out.println("name"+fild.getName()+" value "+s);
                    }
                }
            }else if (type.contains(".List")){
                name = fild.getGenericType().toString();
                name = name.substring(name.lastIndexOf(".")+1,name.length()-1);
                for (Method method : methods) {
                    if (("get"+name.toLowerCase()+"s").equals(method.getName().toLowerCase())){
                        List list = (List) method.invoke(object);
                        for (Object o : list) {
                            Element element = root.addElement(name);

                            write(element,o);
                        }
                    }
                }
            }else {
                name = fild.getGenericType().toString();
                name = name.substring(name.lastIndexOf(".")+1);
                for (Method method : methods) {
                    String mName = method.getName();

                    if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
                        Object obj = method.invoke(object);//获得子标签
                        if (obj!=null){
                            Element element = root.addElement(name);

                            write(element,obj);
                        }
                    }
                }
            }
            // 设置XML文档格式
            OutputFormat outputFormat = OutputFormat.createPrettyPrint();
            // 设置XML编码方式,即是用指定的编码方式保存XML文档到字符串(String),这里也可以指定为GBK或是ISO8859-1
            outputFormat.setEncoding("UTF-8");
            //outputFormat.setSuppressDeclaration(true); //是否生产xml头
            outputFormat.setIndent(true); //设置是否缩进
            outputFormat.setIndent("    "); //以四个空格方式实现缩进
            outputFormat.setNewlines(true); //设置是否换行

            //添加
            FileOutputStream file = new FileOutputStream(DesPath);
            XMLWriter xmlwriter2 = new XMLWriter(file,outputFormat);
            xmlwriter2.write(doucment);
            xmlwriter2.flush();
            xmlwriter2.close();
        }
    }

写在最后,XML快速解析三篇文章是本人很早之前写的,刚刚用上CSDN,所以尝试着把文章发一下。文章内描述的内容与项目实际内容已经不太一致,但是整体结构,设计思想没有变化,感兴趣的童鞋可以到 GitHub:lijieqing/XMLParser 查看源码,大家共同进步,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值