1. 程式人生 > >利用反射將xml轉換為List<Object>

利用反射將xml轉換為List<Object>

反射 uppercase 效率 code varchar2 對象 測試的 trac getname

在將xml轉為實體類的時候,一直對於類型為Integer, date等的很難處理, 無法轉換, 但是後來我發現通過反射可以解決這一問題, 下面和大家分享一下

首先: 給出一個實體類

public class Glxt19K01 {

    private String jylsh;  //     檢驗流水號     varchar2
    private String jyjgbh;
    private String jcxdh;  //     檢測線代號     varchar2
    private Integer jycs;  //     檢驗次數     number
    private
String hpzl; // 號牌種類 varchar2 private String hphm; // 號牌號碼 varchar2 private String clsbdh; // 車輛識別代號 varchar2 private String jyxm; // 檢驗項目 varchar2 private String bxpzh; // 保險憑證號 varchar2 private BigDecimal bxje; // 保險金額 number private
String bxgs; // 保險公司 varchar2 private Date sxrq; // 生效日期 date private Date zzrq; // 終止日期 date private Timestamp jyrq; private Integer pdazt; // get set方法 }

其次:我將真實具體的實現方法,這三個參數大家可以在測試的時候可以看出來,往下看看

public static List<Object> readXML(String tr2, String s, Class<?> clazz) {
//long lasting = System.currentTimeMillis();//效率檢測
List<Object> list = new ArrayList();//創建list集合
try {
//1.創建一個SAXBuilder的對象
SAXReader reader = new SAXReader();
org.dom4j.Document doc = reader.read(new InputSource(new ByteArrayInputStream(s.getBytes("GBK"))));//dom4j讀取
// 4.通過document對象獲取xml文件的根節點
org.dom4j.Element root = doc.getRootElement();//獲得根節點
// 5. 獲取根節點下的子節點body
org.dom4j.Element body = root.element("body");
// 6. 獲取根節點下的二級節點
org.dom4j.Element foo;

for (Iterator i = body.elementIterator(tr2); i.hasNext(); ) {//遍歷t.getClass().getSimpleName()節點
foo = (org.dom4j.Element) i.next();//下一個二級節點
//實例化Object對象
Object obj = clazz.newInstance();
Field[] properties = obj.getClass().getDeclaredFields();//獲得實例的屬性
//實例的get方法
Method getmeth;
//實例的set方法
Method setmeth;
for (int j = 0; j < properties.length; j++) {
//實例的set方法
setmeth = obj.getClass().getMethod(
"set"
+ properties[j].getName().substring(0, 1).toUpperCase()
+ properties[j].getName().substring(1), properties[j].getType());
Object setStr = foo.elementText(properties[j].getName());
//System.out.println(properties[j].getName() + "類型是" + properties[j].getType());
if (foo.elementText(properties[j].getName()) != null) {
if (properties[j].getType() == java.util.Date.class) {
setStr = TransDate.String2Date(foo.elementText(properties[j].getName()));
} else if (properties[j].getType() == java.lang.Integer.class) {
setStr = Integer.parseInt(foo.elementText(properties[j].getName()));
} else if (properties[j].getType() == java.lang.Character.class) {
setStr = foo.elementText(properties[j].getName()).charAt(0);
} else if (properties[j].getType() == java.sql.Timestamp.class) {
setStr = Timestamp.valueOf(foo.elementText(properties[j].getName()));
}
} else {
setStr = null;
}
setmeth.invoke(obj, setStr);//將對應節點的值存入
}
list.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}

最後:我們就測試一下啊

String s="<?xml version=\"1.0\" encoding=\"GBK\"?><root><body><vehispara><jylsh>37030118032900001</jylsh><jcxdh>1</jcxdh><jycs>1</jycs><hpzl>02</hpzl><hphm>魯CK0048</hphm><clsbdh>LVZX32K7XDC517343</clsbdh><jyxm>F1,C1,DC,B1,B2,B0,H1,H4</jyxm><bxpzh></bxpzh><bxje>0</bxje><bxgs></bxgs><sxrq>2017-08-03</sxrq><zzrq>2018-08-03</zzrq><pdazt>1</pdazt></vehispara></body></root>";
 //       
List
<Object> vehispara = QueryResult.readXML("vehispara", s, Glxt19K01.class); List<Glxt19K01> list = new ArrayList<Glxt19K01>(); for (int i = 0; i < vehispara.size(); i++) {
//將List<Object>轉為對應的實體類 list.add((Glxt19K01) vehispara.
get(i)); } for (int a = 0; a < list.size(); a++) { System.out.println("_______________________" + list.get(a)); }

這樣我們就實現了啊

利用反射將xml轉換為List<Object>