一、簡介
最近在項目中需要用到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中也是可以的。