今天我們要探討的一個問題是,如何將xml格式的字串轉換成對象,以及對象轉換成xml字串。 簡介
現如今,雖然資料的傳輸大部分都是用json格式來進行傳輸,但是xml畢竟也會有一些老的項目在進行使用,身為一個萬能的程式員。我們又怎能不會使用它呢。正常的老式方法是通過擷取節點來進行一系列操作,個人感覺太過於複雜、繁瑣。今天推薦一套簡單的api。XStream類。好了廢話不多說,直接上代碼。(為了講述的更加清晰。我們全程不使用任何註解,只調用api來達到效果。在理解了原理的情況下看下註解的文法即會使用) 對象轉xml
首先我們從簡單的對象轉xml為例來進行講解,因為xml轉對象會相對複雜,我們由淺到深。 第一步:匯入jar包,本人項目以gradle搭建。jar包下載引用如下(普通項目從網上找一下jar包放到lib檔案夾下即可)
compile(“com.thoughtworks.xstream:xstream:1.4.10”) 第二步:建立對象(建立User與Customer,不要被名字誤導。。。沒什麼關係)
1.建立User對象(使用lombok建立getset方法,不瞭解的同學直接手動建立即可)
package com.kingboy.springboot.domain.dto;import lombok.Data;import java.util.List;/** * Created by beyondLi on 2017/6/14. */@Datapublic class User { private String name; private Integer age; private List<Customer> customer;}
2.建立Customer對象(同上)
package com.kingboy.springboot.domain.dto;import lombok.Data;/** * Created by beyondLi on 2017/6/14. */@Datapublic class Customer { private String commodity;}
第三步:測試類別
//建立user對象與customer對象並賦值 User user = new User(); Customer customer1 = new Customer(); Customer customer2 = new Customer(); customer1.setCommodity("商品1"); customer2.setCommodity("商品2"); List<Customer> list = new ArrayList<>(); list.add(customer1); list.add(customer2); user.setName("beyondLi"); user.setAge(23); user.setCustomer(list); //建立xStream對象 XStream xStream = new XStream(); //調用toXML 將對象轉成字串 String s = xStream.toXML(user); System.out.println(s);
第四步:輸出結果
第五步:最佳化
上述我們看到了結果,但是貌似和我們想要的不太一樣呀,怎麼有些是全路徑名稱呢。這裡解決方案很簡單。主要講思路。因為關係到xml轉對象時候封裝是否報錯的問題。預設情況下當對象沒有名字的時候,例如最一開始的對象 以及對象中的集合類型中泛型的類型,這些我們都沒辦法給他起名字的,預設情況下它是全路徑名稱。所以如果我們不處理,當xml轉對象的時候傳來的xml直接都是名字,而我們如果直接調用api封裝就會出現因為名字不一致所以封裝失敗而報錯的問題。所以我們要給全路徑名稱的類起別名(注。最好不要無腦性的給所有對象都起別名,雖然也可以解決問題。但是我們最好理解透徹,只給有需要的類起別名),代碼如下
//建立user對象與customer對象並賦值 User user = new User(); Customer customer1 = new Customer(); Customer customer2 = new Customer(); customer1.setCommodity("商品1"); customer2.setCommodity("商品2"); List<Customer> list = new ArrayList<>(); list.add(customer1); list.add(customer2); user.setName("beyondLi"); user.setAge(23); user.setCustomer(list); //建立xStream對象 XStream xStream = new XStream(); //給指定類起別名 xStream.alias("User",User.class); xStream.alias("Customer",Customer.class); //調用toXML 將對象轉成字串 String s = xStream.toXML(user); System.out.println(s);
結果:
希望閱讀到這裡的同學將上面那個起別名理解清楚,什麼時候起別名,什麼時候不需要起別名,這樣才能在xml轉對象的時候不出現任何的偏差和錯誤。 XML轉對象 第一步:匯入jar包。同上 第二步:建立User與Customer對象。同上 第三部 : 測試類別
首先我們展示一下上面提示的不起別名報錯問題,我類比了一個xml類型的字串,但是不起別名
//類比一個xml格式字串 String xml = "<user>\n" + " <name>beyondLi</name>\n" + " <age>23</age>\n" + " <customer>\n" + " <Customer>\n" + " <commodity>商品1</commodity>\n" + " </Customer>\n" + " <Customer>\n" + " <commodity>商品2</commodity>\n" + " </Customer>\n" + " </customer>\n" + "</user>"; //建立xStream對象 XStream xstream = new XStream(); //起別名,先不寫,讓其報錯 User user2 = (User) xstream.fromXML(xml); System.out.println(user2);
結果
和明顯,雖然我們對象user和customer起名字都沒有錯誤。但是報錯說找不到。這個報錯結合上面的對象轉xml的結果。我們就可以明顯的看出問題出在了哪裡。
正確代碼如下
//類比一個xml格式字串 String xml = "<user>\n" + " <name>beyondLi</name>\n" + " <age>23</age>\n" + " <customer>\n" + " <Customer>\n" + " <commodity>商品1</commodity>\n" + " </Customer>\n" + " <Customer>\n" + " <commodity>商品2</commodity>\n" + " </Customer>\n" + " </customer>\n" + "</user>"; //建立xStream對象 XStream xstream = new XStream(); //將別名與xml名字相對應 xstream.alias("user", User.class); xstream.alias("Customer", Customer.class); User user2 = (User) xstream.fromXML(xml); System.out.println(user2);
結果:
轉換成功
其實xml與對象之間的相互轉換並沒有難度,但是經常出錯和不成功其實就是因為在別名上的問題。而導致無法匹配。希望這篇文當可以協助更多的同學解決問題。
以上觀點僅是個人理解。如有錯誤或不完善,還望指出,共同成長