一.简介
官网:x-stream.github.io/tutorial.html
关于x-stream的使用,如果对象比较复杂,处理比较多,官网有很多很详细的例子。
总结:
1.定义一个映射对象
2.配置一些节点的映射规则(取别名)
3.调用XStream的实例方法toXML(),fromXML()
二.使用
依赖包:包含xmlpull和xpp3
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.9</version>
</dependency>
Demo:(嵌套多层)
@Data
@XStreamAlias("PWBRequest")
public class FsStockReq {
/**
* 接口的方法名
*/
private String transactionName;
private Header header;
private QueryCondtion queryCondtion;
@Data
@XStreamAlias("header")
public static class Header {
public String application;
public String requestTime;
public Header(String application, String requestTime) {
this.application = application;
this.requestTime = requestTime;
}
}
@Data
@XStreamAlias("header")
public static class QueryCondtion {
/**
* 商品编码
*/
private String goodsCode;
/**
* 开始日期
*/
public String startDate;
/**
* 结束日期
*/
public String endDate;
public QueryCondtion(String goodsCode, String startDate, String endDate) {
this.goodsCode = goodsCode;
this.startDate = startDate;
this.endDate = endDate;
}
}
}
Note:XStream不关心变量的可见性,不需要getter,setter方法,不需要默认构造方法
基本的初始化 XStream
//XStream传入各种实现,可以解析不同文件,包括解析json new XStream(new JsonHierarchicalStreamDriver())
XStream xstream = new XStream();
XStream xstream = new XStream(new DomDriver()); // does not require XPP3 library
XStream xstream = new XStream(new StaxDriver()); // does not require XPP3 library starting with Java 6
个性化:
注解@XStreamAlias("PWBRequest")
可以使用xstream.alias()
代替
xstream.alias("PWBRequest",FsStockReq.class)
没有这一步会以完全限定路径展示根节点
//使用 @XStreamAlias("PWBRequest")等注解
xstream.processAnnotations(obj.getClass());
String xml = xstream.toXML(obj);
<!--未使用@XStreamAlias("PWBRequest")注解-->
<com.travel.travelapis.pojo.FsStockReq>
<transactionName>FS_STOCK_REQ</transactionName>
<header>
<application>SendCode</application>
<requestTime>Wed May 19 13:05:16 CST 2021</requestTime>
</header>
<queryCondtion>
<goodsCode>PST20181109039175</goodsCode>
<startDate>2021-05-18</startDate>
<endDate>2021-05-18</endDate>
</queryCondtion>
</com.travel.travelapis.pojo.FsStockReq>
<PWBRequest>
<transactionName>FS_STOCK_REQ</transactionName>
<header>
<application>SendCode</application>
<requestTime>Wed May 19 13:06:51 CST 2021</requestTime>
</header>
<queryCondtion>
<goodsCode>PST20181109039175</goodsCode>
<startDate>2021-05-18</startDate>
<endDate>2021-05-18</endDate>
</queryCondtion>
</PWBRequest>
//忽略节点 注解@XStreamImplicit
xstream.addImplicitCollection(Clazz<T>, string);
使用内部类是需要定义为static,否则解析出的xml会多以节点<outer-class reference="../.."/>
{"PWBRequest": {
"transactionName": "FS_STOCK_REQ",
"header": {
"application": "SendCode",
"requestTime": "Wed May 19 13:41:20 CST 2021"
},
"queryCondtion": {
"goodsCode": "PST20181109039175",
"startDate": "2021-05-18",
"endDate": "2021-05-18"
}
}}
@XStreamOmitField 忽略属性
@XStreamAlias 定义别名
@XStreamAsAttribute 定义为属性
@XStreamImplicit 去除外层节点
//下面ToAttributedValueConverter的作用是把其他全部变成属性值,指定的为值
@XStreamConverter(value=ToAttributedValueConverter.class, strings={"value"})