XML解析成實體類統一工具類

一、簡介

最近在項目中需要用到XML解析成實體類,並將值封裝到實體類屬性中,於是封裝了一個工具類。下面是具體的代碼:

NHXmlParseUtils.java:

package com.ly.cloud.common.webservice;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Node;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Method;
import java.util.*;

/**
 * @description: XML解析統一工具類
 * @author: weishihuai
 * @mail: [email protected]
 * @Date: 2020/6/28 14:39
 * @version: 1.0
 */
public class NHXmlParseUtils {

    private static final Logger logger = LoggerFactory.getLogger(NHXmlParseUtils.class);

    /**
     * 解析XML文本映射到實體類
     *
     * @param returnXml     待解析的XML文本
     * @param cls           解析生成後映射的Class類對象
     * @param fieldXmlPaths XMLPaths集合(XML中的標籤路徑)
     * @return
     */
    public static List<?> parserXmlToEntity(String returnXml, Class cls, Map<String, String> fieldXmlPaths) {
        Document document;
        try {
            //將給定文本解析爲XML文檔並返回新創建的文檔
            document = DocumentHelper.parseText(returnXml);
            //存儲屬性的名稱
            List<String> filedNames = new ArrayList<>();
            //存放<屬性,values>
            Map<String, List<Node>> map = new HashMap<>();
            if (null != fieldXmlPaths && !fieldXmlPaths.isEmpty()) {
                Iterator iterator = fieldXmlPaths.entrySet().iterator();
                while (iterator.hasNext()) {
                    Map.Entry entry = (Map.Entry) iterator.next();
                    Object key = entry.getKey();
                    Object value = entry.getValue();
                    List<Node> nodes = document.selectNodes(value.toString());
                    List<Node> list = new ArrayList<>();
                    for (Node node : nodes) {
                        list.add(node);
                    }
                    //循環放入屬性-> 對應的節點
                    map.put(key.toString(), list);
                    filedNames.add(key.toString());
                }
            }

            List list = new ArrayList();
            //循環將節點的值放入到對象中,然後放入到list
            for (int i = 0; i < map.get(filedNames.get(0)).size(); i++) {
                Object instance = cls.newInstance();
                for (String fieldName : filedNames) {
                    //拼接方法名稱
                    String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                    //通過反射獲取setter方法
                    Method method = cls.getMethod(methodName, String.class);
                    //通過invoke調用實體類對應的setter方法
                    method.invoke(instance, map.get(fieldName).get(i).getText());
                }
                list.add(instance);
            }
            return list;
        } catch (Exception e) {
            logger.error("XML解析失敗!");
            e.printStackTrace();
        }
        return null;
    }

}

測試:

package com.ly.cloud.common.webservice;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Test {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        String returnXml = "<RdrLoanInfo><Cardno>1607300009</Cardno><Name>李明傑</Name><Title>射鵰英雄傳</Title><Callno>I247.58/204</Callno><Barcode>A2144907</Barcode><Local>書庫(304室)</Local><Author>金庸著</Author><Loandate>20200102</Loandate><Returndate>*20200911</Returndate><Cardno>1607300009</Cardno><Name>李明傑</Name><Title>射鵰英雄傳</Title><Callno>I247.58/204</Callno><Barcode>A2144904</Barcode><Local>書庫(304室)</Local><Author>金庸著</Author><Loandate>20200102</Loandate><Returndate>*20200911</Returndate></RdrLoanInfo>";
        //解析返回的XML數據
        Map<String, String> fieldXmlPaths = new HashMap<>();
        fieldXmlPaths.put("Title", "//RdrLoanInfo/Title");
        fieldXmlPaths.put("Callno", "//RdrLoanInfo/Callno");
        fieldXmlPaths.put("Barcode", "//RdrLoanInfo/Barcode");
        fieldXmlPaths.put("Local", "//RdrLoanInfo/Local");
        fieldXmlPaths.put("Author", "//RdrLoanInfo/Author");
        fieldXmlPaths.put("Loandate", "//RdrLoanInfo/Loandate");
        fieldXmlPaths.put("Returndate", "//RdrLoanInfo/Returndate");
        List<ReturnBook> studentBooksList = (List<ReturnBook>) NHXmlParseUtils.parserXmlToEntity(returnXml, ReturnBook.class, fieldXmlPaths);
        System.out.println(studentBooksList);
    }

}

/**
 * 借書信息類
 */
class ReturnBook {
    private String Title;
    private String Callno;
    private String Barcode;
    private String Local;
    private String Author;
    private String Loandate;
    private String Returndate;

    public String getTitle() {
        return Title;
    }

    public void setTitle(String title) {
        Title = title;
    }

    public String getCallno() {
        return Callno;
    }

    public void setCallno(String callno) {
        Callno = callno;
    }

    public String getBarcode() {
        return Barcode;
    }

    public void setBarcode(String barcode) {
        Barcode = barcode;
    }

    public String getLocal() {
        return Local;
    }

    public void setLocal(String local) {
        Local = local;
    }

    public String getAuthor() {
        return Author;
    }

    public void setAuthor(String author) {
        Author = author;
    }

    public String getLoandate() {
        return Loandate;
    }

    public void setLoandate(String loandate) {
        Loandate = loandate;
    }

    public String getReturndate() {
        return Returndate;
    }

    public void setReturndate(String returndate) {
        Returndate = returndate;
    }

    @Override
    public String toString() {
        return "ReturnBook{" +
                "Title='" + Title + '\'' +
                ", Callno='" + Callno + '\'' +
                ", Barcode='" + Barcode + '\'' +
                ", Local='" + Local + '\'' +
                ", Author='" + Author + '\'' +
                ", Loandate='" + Loandate + '\'' +
                ", Returndate='" + Returndate + '\'' +
                '}';
    }
}

運行結果: 

[ReturnBook{Title='射鵰英雄傳', Callno='I247.58/204', Barcode='A2144907', Local='書庫(304室)', Author='金庸著', Loandate='20200102', Returndate='*20200911'}, ReturnBook{Title='射鵰英雄傳', Callno='I247.58/204', Barcode='A2144904', Local='書庫(304室)', Author='金庸著', Loandate='20200102', Returndate='*20200911'}]

當然,如果不需要封裝到實體類中,也可以稍微改善一下,封裝到Map中也是可以的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章