一、Xstream引入
1、背景說明
Xstream是一個功能比較強大的xml和java對象互轉的工具包。可以通過簡單的api調用,便實現一系列的轉換操作。大家都知道微信的接口調用都是通過xml的形式進行數據交互的,所以在一些傳統的接口調用和微信開發過程當中尤其適用。
2、項目依賴
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.10</version>
</dependency>
二、使用說明
- 使用繼承共用類屬性時,@XStreamAlias別名註解要使用在子類上來標記節點。否則會出現反射出錯的問題。
- @XStreamAsAttribute註解可以使定義對象的屬性映射爲xml文件的屬性。
- @XStreamImplicit註解來標記不需要在xml文件中出現的節點信息
- Xstream提供了好多種driver來方便進行轉換時選擇使用。如果使用了xpp3相關的驅動,則需要另外引入xpp3相關的依賴。
- 具體使用示例如下(普通編碼實現):
XStream xstream = new XStream();
xstream.alias("person", Person.class);
Person joe = new Person("Joe", "Walnes");
String xml = xstream.toXML(joe);
這樣,輸出的xml字串即爲對象轉換出的xml內容。另外,還可以使用Xstream提供的toXML的其他方法,進行轉換內容輸出到文件。具體爲:
XStream xStream = new XStream();
xstream.alias("person", Person.class);
Person obj = new Person("Joe", "Walnes");
xStream.toXML(obj,new FileOutputStream(new File("xxx.xml")));
- 使用註解實現
使用註解實現轉換時,除了要知道上面介紹的幾個主要註釋之外,還要在初始化玩Xstream對象之後,進行處理註解的設置,如下:
XStream xStream = new XStream();
xStream.processAnnotations(XXX.class);
// XXX爲具體的根節點類,可以使用@XStreamAlias標註別名,也可以不用。
- 自己封裝的工具類
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.basic.DateConverter;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.TimeZone;
/**
* @author mark
* @version 1.0
* @description xml與Bean互轉工具類
* @since 2018/7/12
*/
public class XmlParseUtil {
private static final DomDriver DOM_DRIVER =
new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_"));
private static final DateConverter DATE_CONVERTER =
new DateConverter("yyyy-MM-dd HH:mm:ss", null, TimeZone.getTimeZone("GMT+8"));
/**
* @param filePath file's path
* @param clz the class which is target Bean
* @param <T>
* @return the bean parse from xml
*/
public static <T> T xml2Bean(String filePath, Class<T> clz) {
// loading driver
// xstream也業提供了json的轉換驅動,JettisonMappedXmlDriver和JsonHierarchicalStreamDriver。
XStream xStream = new XStream(DOM_DRIVER);
// setup security configuration
// setupDefaultSecurity to be removed after 1.5
XStream.setupDefaultSecurity(xStream);
xStream.allowTypesByWildcard(new String[] {"com.shuzhi.**"});
// register converter
xStream.registerConverter(DATE_CONVERTER);
// processing annotations
xStream.processAnnotations(clz);
// processing xml
T t = (T) xStream.fromXML(new File(filePath));
return t;
}
/**
* return string of obj parsed by xstream.
*
* @param obj
* @return
*/
public static String toXml(Object obj) {
XStream xStream = new XStream(DOM_DRIVER);
// register converter
xStream.registerConverter(DATE_CONVERTER);
// processing annotations
xStream.processAnnotations(obj.getClass());
return xStream.toXML(obj);
}
/**
* parse obj to xml and write to file.
*
* @param obj
* @param filePath file path
*/
public void outputFile(Object obj, String filePath) throws FileNotFoundException {
XStream xStream = new XStream(DOM_DRIVER);
// register converter
xStream.registerConverter(DATE_CONVERTER);
// processing annotations
xStream.processAnnotations(obj.getClass());
// create target file
FileOutputStream fileOutputStream = new FileOutputStream(new File(filePath));
// output
xStream.toXML(obj, fileOutputStream);
}
}