爲了更好的開發微信公衆號,你必須學會Xstream使用

一、Xstream引入

1、背景說明

Xstream是一個功能比較強大的xml和java對象互轉的工具包。可以通過簡單的api調用,便實現一系列的轉換操作。大家都知道微信的接口調用都是通過xml的形式進行數據交互的,所以在一些傳統的接口調用和微信開發過程當中尤其適用。

2、項目依賴

<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.10</version>
</dependency>

二、使用說明

  1. 使用繼承共用類屬性時,@XStreamAlias別名註解要使用在子類上來標記節點。否則會出現反射出錯的問題。
  2. @XStreamAsAttribute註解可以使定義對象的屬性映射爲xml文件的屬性。
  3. @XStreamImplicit註解來標記不需要在xml文件中出現的節點信息
  4. Xstream提供了好多種driver來方便進行轉換時選擇使用。如果使用了xpp3相關的驅動,則需要另外引入xpp3相關的依賴。
  5. 具體使用示例如下(普通編碼實現):
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")));
  1. 使用註解實現
    使用註解實現轉換時,除了要知道上面介紹的幾個主要註釋之外,還要在初始化玩Xstream對象之後,進行處理註解的設置,如下:
XStream xStream = new XStream();
xStream.processAnnotations(XXX.class);
// XXX爲具體的根節點類,可以使用@XStreamAlias標註別名,也可以不用。
  1. 自己封裝的工具類

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);
  }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章