设为首页 加入收藏

TOP

简单实体类和xml文件的相互转换(一)
2017-10-12 18:09:09 】 浏览:10818
Tags:简单 实体 类和 xml 文件 相互 转换

最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类。题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换。于是今天下午立马动手

试了下,做了个简单的模型,可以将简单的实体类和xml文件进行相互转换,但对实体类的属性类型有限制,目前只支持String, Integer, Double三种类型。但是后面可以扩展。

我的大概思路是这样的,只要能拿到实体类的类型信息,我就能拿到实体类的全部字段名称和类型,拼属性的set和get方法更是简单明了,这时候只需要通过方法的反射,将xml文件的数据读取出来给这个反射即可。

反过来只要给我一个任意对象,我就能通过反射拿到该对象所有字段的值,这时候在写xml文件即可。

具体代码如下:

package com.pcq.entity;

import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class XMLAndEntityUtil {
    private static Document document = DocumentHelper.createDocument();
    
    /**
     * 判断是否是个xml文件,目前类里尚未使用该方法
     * @param filePath 
     * @return
     */
    @SuppressWarnings("unused")
    private static boolean isXMLFile(String filePath) {
        File file = new File(filePath);
        if(!file.exists() || filePath.indexOf(".xml") > -1) {
            return false;
        }
        return true;
    }
    
    /**
     * 将一组对象数据转换成XML文件
     * @param list
     * @param filePath 存放的文件路径
     */
    public static <T> void writeXML(List<T> list, String filePath) {
        Class<?> c = list.get(0).getClass();
        String root = c.getSimpleName().toLowerCase() + "s";
        Element rootEle = document.addElement(root);
        for(Object obj : list) {
            try {
                Element e = writeXml(rootEle, obj);
                document.setRootElement(e);
                writeXml(document, filePath);
            } catch (NoSuchMethodException | SecurityException
                    | IllegalAccessException | IllegalArgumentException
                    | InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 通过一个根节点来写对象的xml节点,这个方法不对外开放,主要给writeXML(List<T> list, String filePath)提供服务
     * @param root
     * @param object
     * @return
     * @throws NoSuchMethodException
     * @throws SecurityException
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     * @throws InvocationTargetException
     */
    private static Element writeXml(Element root, Object object) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Class<?> c = object.getClass();
        String className = c.getSimpleName().toLowerCase();
        Element ele = root.addElement(className);
        Field[] fields = c.getDeclaredFields();
        for(Field f : fields) {
            String fieldName = f.getName();
            String param = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
            Element fieldElement = ele.addElement(fieldName);
            Method m = c.getMethod("get" + param, null);
            String s = "";
            if(m.invoke(object, null) != null) {
                s = m.invoke(object, null).toString();
            }
            fieldElement.setText(s);
        }
        return root;
    }
    
    /**
     * 默认使用utf-8
     * @param c
     * @param filePath
     * @return
     * @throws UnsupportedEncodingException
     * @throws FileNotFoundException
     */
    public static <T> List<T> getEntitys(Class<T> c, String filePath) throws UnsupportedEncodingException, FileNotFoundException {
        return getEntitys(c, filePath, "utf-8");
    }
    /**
     * 将一个xml文件转变成实体类
     * @param c
     * @param filePath
     * @return
     * @thr
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇SpringMVC---进阶篇 下一篇关于Date 时区问题闹得一个小笑话

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目