java 使用demo4j读取xml文件(java反射原理)

操作xml的具体方法 

package xml;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import utils.StringEx;

import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class OperateXML {

    public static String writeXml(List<Object> list){
        Document doc = DocumentHelper.createDocument();
        Element listRoot = doc.addElement("list");

        //list写入到Document对象中
        list.parallelStream().forEach(p -> {
            String className = p.getClass().getSimpleName();
            Element obj = listRoot.addElement(className);
            //对每个对象进行遍历 获取所有的方法
            List<String> methodList = new ArrayList<>();
            //1、获取自身的所有方法 public protected private  这里只要获取自身的就足够了
            for(Method method : p.getClass().getDeclaredMethods()) {
                methodList.add(method.getName());
            }

            //2、获取自身的所有方法 public protected private + extends  父类  + implements 接口的方法
            /*for(Method method : p.getClass().getMethods()) {
                methodList.add(method.getName());
            }*/

            //获取所有的字段  和  标准的 get方法
            Field[] fields = p.getClass().getDeclaredFields();
            for(Field field : fields) {
                try{
                    String name = field.getName();
                    //添加属性
                    Element element = obj.addElement(name);

                    String methodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
                    Method method;
                    if(methodList.contains(methodName)) {
                        method = p.getClass().getDeclaredMethod(methodName);
                        Object value = method.invoke(p);
                        element.addText(value.toString());
                        //System.out.println(name + ":" + value);
                    } else {
                        System.out.println(name + ":没有此方法");
                        element.addText("");
                    }
                }catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
        });

        //物理存储
        File xmlFile = null;
        try {
            XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
            String fileName = StringEx.newUUID()+".xml";
            //获取类所在路径
            String path = OperateXML.class.getProtectionDomain().getCodeSource().getLocation().getPath() + File.separator + "xmlPath";
            File xmlFilePath = new File(path);
            if (!xmlFilePath.exists()) {
                xmlFilePath.mkdirs();
            }
            xmlFile = new File(xmlFilePath+File.separator+fileName);
            FileOutputStream fos = new FileOutputStream(xmlFile);
            writer.setOutputStream(fos);
            writer.write(doc);
            //System.out.println("写出完毕!");
            writer.close();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //返回 路径+生成的文件名
        return xmlFile.getAbsolutePath();
    }

    public static List<Object> readXml(String path) {
        Field[] fields = ObjectOne.class.getDeclaredFields();
        String className = ObjectOne.class.getSimpleName();

        List<Object> objList = new ArrayList<Object>();
        try {
            SAXReader reader = new SAXReader();
            Document doc = reader.read(new File(path));
            Element root = doc.getRootElement();
            List<Element> nextList = root.elements(className);
            String fieldValue = "";
            for(int k=0;k < nextList.size();k++){
                ObjectOne p = new ObjectOne();
                Method method;
                for(Field field:fields){
                    Element fieldValueEle = nextList.get(k).element(field.getName());
                    fieldValue = fieldValueEle.getText();
                    String methodName = "set"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
                    method = p.getClass().getDeclaredMethod(methodName,String.class);
                    method.invoke(p,fieldValue);
                }
                objList.add(p);
            }

            className = ObjectTwo.class.getSimpleName();
            fields = ObjectTwo.class.getDeclaredFields();
            nextList = root.elements(className);
            fieldValue = "";
            for(int k=0;k < nextList.size();k++){
                ObjectTwo p = new ObjectTwo();
                Method method;
                for(Field field:fields){
                    Element fieldValueEle = nextList.get(k).element(field.getName());
                    fieldValue = fieldValueEle.getText();
                    List<ObjectOne> list = null;
                    if(field.getName().equals("teamMemberList")){
                         list = JSONArray.parseArray(fieldValue,ObjectOne.class);
                    }
                    String methodName = "set"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
                    PropertyDescriptor pd = new PropertyDescriptor(field.getName(), p.getClass());
                    method = pd.getWriteMethod();//获得写方法
                    if(!field.getName().equals("teamMemberList")){
                        method.invoke(p,fieldValue);
                    }else{
                        p.setTeamMemberList(list);
                    }
                }
                objList.add(p);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return objList;
    }
}
package xml;

public class ObjectOne {

    private String userId;

    private String userName;

    private String userSex;

    private String userAge;

    public ObjectOne() {
    }

    public ObjectOne(String userId, String userName, String userSex, String userAge) {
        this.userId = userId;
        this.userName = userName;
        this.userSex = userSex;
        this.userAge = userAge;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserSex() {
        return userSex;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    public String getUserAge() {
        return userAge;
    }

    public void setUserAge(String userAge) {
        this.userAge = userAge;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("{");
        sb.append("\"userId\":\"")
                .append(userId).append('\"');
        sb.append(",\"userName\":\"")
                .append(userName).append('\"');
        sb.append(",\"userSex\":\"")
                .append(userSex).append('\"');
        sb.append(",\"userAge\":\"")
                .append(userAge).append('\"');
        sb.append('}');
        return sb.toString();
    }
}
package xml;

import java.util.List;

public class ObjectTwo {

    private String teamId;

    private String teamName;

    private String teamSize;

    private List<ObjectOne> teamMemberList;

    public ObjectTwo() {
    }

    public ObjectTwo(String teamId, String teamName, String teamSize, List<ObjectOne> teamMemberList) {
        this.teamId = teamId;
        this.teamName = teamName;
        this.teamSize = teamSize;
        this.teamMemberList = teamMemberList;
    }

    public String getTeamId() {
        return teamId;
    }

    public void setTeamId(String teamId) {
        this.teamId = teamId;
    }

    public String getTeamName() {
        return teamName;
    }

    public void setTeamName(String teamName) {
        this.teamName = teamName;
    }

    public String getTeamSize() {
        return teamSize;
    }

    public void setTeamSize(String teamSize) {
        this.teamSize = teamSize;
    }

    public List<ObjectOne> getTeamMemberList() {
        return teamMemberList;
    }

    public void setTeamMemberList(List<ObjectOne> teamMemberList) {
        this.teamMemberList = teamMemberList;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("{");
        sb.append("\"teamId\":\"")
                .append(teamId).append('\"');
        sb.append(",\"teamName\":\"")
                .append(teamName).append('\"');
        sb.append(",\"teamSize\":\"")
                .append(teamSize).append('\"');
        sb.append(",\"teamMemberList\":")
                .append(teamMemberList);
        sb.append('}');
        return sb.toString();
    }
}

主函数执行 

package xml;

import utils.StringEx;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class App {

    public static void main(String args[]){

        List<Object> objList = new LinkedList<>();
        List<ObjectOne> objOneList = new LinkedList<>();

        ObjectOne objectOne = new ObjectOne(StringEx.newUUID(),"裘千仞","1","55");
        objList.add(objectOne);
        objOneList.add(objectOne);

        objectOne = new ObjectOne(StringEx.newUUID(),"欧阳锋","1","45");
        objList.add(objectOne);
        objOneList.add(objectOne);

        objectOne = new ObjectOne(StringEx.newUUID(),"黄药师","1","44");
        objList.add(objectOne);
        objOneList.add(objectOne);

        objectOne = new ObjectOne(StringEx.newUUID(),"洪七公","1","43");
        objList.add(objectOne);
        objOneList.add(objectOne);

        ObjectTwo objectTwo = new ObjectTwo(StringEx.newUUID(),"青帮",String.valueOf(objOneList.size()),objOneList);
        objList.add(objectTwo);

        String fileName = OperateXML.writeXml(objList);
        System.out.println(fileName);

        System.out.println(OperateXML.readXml(fileName));

    }
}

StringEx中的newUUID()方法 

    public static final String newUUID() {
        return UUID.randomUUID().toString().replace("-", "").toUpperCase();
    }

猜你喜欢

转载自blog.csdn.net/qq_29777207/article/details/81772596