XStream輕鬆轉換xml和java物件
阿新 • • 發佈:2019-01-02
首先引入所需的jar:
xstream-1.4.9、xpp3_min-1.1.4c、dom4j-1.6.1,
或用maven管理jar包時在pom.xml中新增:
實體類如下:<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream --> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.9</version> </dependency> <!-- https://mvnrepository.com/artifact/xpp3/xpp3_min --> <dependency> <groupId>xpp3</groupId> <artifactId>xpp3_min</artifactId> <version>1.1.4c</version> </dependency> <!-- https://mvnrepository.com/artifact/dom4j/dom4j --> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency>
package com.cn.entity;
public class Address {
//國
private String country;
//省
private String province;
//市
private String city;
//縣
private String county;
//鎮
private String town;
get...
set...
}
XStream工具類:<pre name="code" class="java">package com.cn.entity; import java.util.List; public class Person { //姓名 private String name; //性別 private String sex; //年齡 private int age; //地址 private List<Address> Address; get... set... }
package com.cn.util; import com.cn.entity.Address; import com.cn.entity.Person; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; /** * XStream工具類 * @author sun.kai * 2016年8月13日 */ public class XStreamUtil { private static XStream xStream; //JVM載入類時會執行這些靜態的程式碼塊,如果static程式碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個程式碼塊只會被執行一次。 static{ xStream = new XStream(new DomDriver()); /* * 使用xStream.alias(String name, Class Type)為任何一個自定義類建立到類到元素的別名 * 如果不使用別名,則生成的標籤名為類全名 */ xStream.alias("person", Person.class); xStream.alias("address", Address.class); //將某一個類的屬性,作為xml頭資訊的屬性,而不是子節點 xStream.useAttributeFor(Address.class, "country"); //對屬性取別名 xStream.aliasField("省", Address.class,"province"); } //xml轉java物件 public static Object xmlToBean(String xml){ return xStream.fromXML(xml); } //java物件轉xml public static String beanToXml(Object obj){ return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xStream.toXML(obj); } }
測試用例:
package com.test.test;
import java.util.ArrayList;
import java.util.List;
import com.cn.entity.Address;
import com.cn.entity.Person;
import com.cn.util.XStreamUtil;
public class TestXStream {
public static void main(String[] args) {
long time1 = System.currentTimeMillis();
//測試java物件轉xml,java物件中包含集合物件
Person person = new Person();
person.setName("admin管理員");
person.setSex("男");
person.setAge(25);
List<Address> adds = new ArrayList<Address>();
Address address1 = new Address();
address1.setCountry("中國");
address1.setProvince("安徽");
address1.setCity("宿州");
address1.setCounty("蕭縣");
Address address2 = new Address();
address2.setCountry("中國");
address2.setProvince("上海");
address2.setCity(null);
address2.setCounty("");
adds.add(address1);
adds.add(address2);
person.setAddress(adds);
String xml = XStreamUtil.beanToXml(person);
System.out.println(xml);
//測試xml轉java物件
Person person2 = (Person) XStreamUtil.xmlToBean(xml);
System.out.println(person2.getAddress().get(1).getProvince());
long time2 = System.currentTimeMillis();
System.out.println((time2-time1)+"ms");
}
}
執行後控制檯列印:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>admin管理員</name>
<sex>男</sex>
<age>25</age>
<Address>
<address country="中國">
<省>安徽</省>
<city>宿州</city>
<county>蕭縣</county>
</address>
<address country="中國">
<省>上海</省>
<county></county>
</address>
</Address>
</person>
上海
669ms
總結:
(1) XStream是一個可以將javaBean與XML雙向轉換的java類庫。
(2) Java到xml,使用toXML()方法;xml到Java,用fromXML()方法。
(3) 類別名,用alias(String name, Class type)。
(4) 類成員別名,用aliasField(String alias, Class definedIn, String fieldName)。
(5) 將某一個類的屬性,作為xml頭資訊的屬性,而不是子節點,用useAttributeFor(Class definedIn, String fieldName)。
(5) 類成員作為屬性別名,用 aliasAttribute(Class definedIn, String attributeName, String alias),單獨命名沒有意義,還要通過useAttributeFor(Class definedIn, String fieldName) 應用到某個類上。
(6) XStream預設當String型別的屬性值為null時不封裝到xml中。可以根據實際傳xml情況,選擇物件屬性set空字串還是null。