淺析如何將XML文檔解析成java對象(待梳理)


User類

public class User implements Serializable {

    private static final long serialVersionUID = 7506854293380407436L;
    private Integer id;
    private String loginName;
    private String password;
    private Date createDate;
    private String username;

    public User() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public String getUsername() {
        System.out.println("User類中的getUser方法");
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", loginName=" + loginName + ", password=" + password + ", createDate=" + createDate
                + ", username=" + username + "]";
    }

XML文檔:admin.xml

<?xml version="1.0" encoding="UTF-8"?>
<user id="1">
    <loginName>admin@qq.com</loginName>
    <password>123123</password>
    <username>超級管理員</username>
    <createDate>2017-03-07</createDate>
</user>

將XML文檔解析成Java對象

public class XmlParser {

    public static void main(String[] args) throws Exception {

        // 待填充user對象
        User user = new User();
        // 獲得User的class對象,后續要使用反射
        Class clazz = user.getClass();

        File file = new File("D:\\jsd1707\\xtt\\workspace\\rams\\src\\main\\java\\admin.xml");
        SAXReader reader = new SAXReader();
        // 讀取xml文件到Document中
        Document doc = reader.read(file);
        // 獲取xml文件的根節點
        Element rootElement = doc.getRootElement();
        System.out.println("根節點:" + rootElement.getName());

        // 獲得根節點的所有屬性
        List<Attribute> attrList = rootElement.attributes();
        for (Attribute attribute : attrList) {
            // 根節點某個屬性名
            String attrName = attribute.getName();
            System.out.println("當前節點屬性名:" + attrName);
            // 根節點某個屬性值
            String attrValue = attribute.getValue();
            // 通過屬性名定位user對象中對應屬性的setter方法
            Field filed = clazz.getDeclaredField(attrName);
            Class cla = filed.getType();// 屬性類型
            System.out.println("當前屬性類型名稱:" + cla.getName());
            Object val = typeTransfer(cla.getName(), attrValue);
            String methodName = "set" + attrName.substring(0, 1).toUpperCase() + attrName.substring(1);
            System.out.println("當前節點屬性對應方法名:" + methodName);
            Method method = clazz.getDeclaredMethod(methodName, cla);
            method.invoke(user, val);
        }

        // 獲取子節點
        List<Element> elements = rootElement.elements();
        for (Element element : elements) {
            // 根節點某個節點名
            String elemName = element.getName();
            System.out.println("當前節點屬性名:" + elemName);
            // 根節點某個節點值
            String elemValue = element.getText();
            // 通過節點名定位user對象中對應屬性的setter方法
            Field filed = clazz.getDeclaredField(elemName);
            Class cla = filed.getType();// 屬性類型
            System.out.println("當前屬性類型名稱:" + cla.getName());
            Object val = typeTransfer(cla.getName(), elemValue);
            String methodName = "set" + elemName.substring(0, 1).toUpperCase() + elemName.substring(1);
            System.out.println("當前節點屬性對應方法名:" + methodName);
            Method method = clazz.getDeclaredMethod(methodName, cla);
            method.invoke(user, val);
        }
        System.out.println(user);
    }

    private static Object typeTransfer(String typeName, String vlaue) throws ParseException {
        switch (typeName) {
        case "java.lang.Integer":
            return Integer.valueOf(vlaue);
        case "java.lang.String":
            return vlaue;
        case "java.util.Date":
            return new SimpleDateFormat("yyyy-MM-dd").parse(vlaue);
        }
        return null;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM