一、资源下载
二、注解
@XStreamAlias
java对象在xml中以标签的形式显示时,如果名字与类名或者属性名不一致,可以使用该标签并在括号内注明别名
@XStreamOmitField
在输出XML的时候忽略该属性
@XStreamImplicit
如果该属性是一个列表或者数组,在XML中不显示list或者Array字样
@XStreamAsAttribute
该属性不单独显示成XML节点,而是作为属性显示出来
@XStreamConverter
设置转换器
@XStreamConverters
converter主要用于将某些字段进行复杂的转换,转换过程写在一个类中。然后将其注册到XStream
三、实例
1.xml文件
<movie>
<code>200</code>
<performerlist>
<performer name="tony" age="49"/>
<performer name="andy" age="50"/>
</performerlist>
<information>
<title>Infernal Affairs</title>
<year>2002</year>
<film_review organization="times" film_score="95">perfect movie</film_review>
</information>
</movie>
2.bean类
package com.xml.xstream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import java.util.List;
/**
* Created by askilledhand on 2021/1/27
*/
@XStreamAlias("movie")
public class ResultBean {
public String code;
public PerformerList performerlist;
public Information information;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public PerformerList getPerformerList() {
return performerlist;
}
public void setPerformerList(PerformerList performerlist) {
this.performerlist = performerlist;
}
public Information getInfomation() {
return information;
}
public void setInfomation(Information information) {
this.information = information;
}
@XStreamAlias("performerlist")
public static class PerformerList {
@XStreamImplicit(itemFieldName = "performer") // 节点注解
public List<Performer> performers;
public List<Performer> getList() {
return performers;
}
public void setList(List<Performer> performers) {
this.performers = performers;
}
@XStreamAlias("performer")
public static class Performer {
@XStreamAsAttribute() @XStreamAlias("name") // 属性注解
private String name;
@XStreamAsAttribute() @XStreamAlias("age") // 属性注解
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
}
@XStreamAlias("information")
public static class Information {
private String title;
private String year;
@XStreamAlias("film_review") // 变量名用film_review的话,就可以不用注解
public FilmReview filmReview;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public FilmReview getFilmReview() {
return filmReview;
}
public void setFilmReview(FilmReview filmReview) {
this.filmReview = filmReview;
}
@XStreamAlias("film_review")
@XStreamConverter(FilmReviewConverter.class)
public static class FilmReview {
public String value;
public String organization;
public String film_score;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getOrganization() {
return organization;
}
public void setOrganization(String organization) {
this.organization = organization;
}
public String getFilm_score() {
return film_score;
}
public void setFilm_score(String film_score) {
this.film_score = film_score;
}
}
}
}
3.转换器(节点既有属性又有值)
package com.xml.xstream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
/**
* Created by askilledhand on 2021/1/27
*/
public class FilmReviewConverter implements Converter {
/**
* 将java对象转为xml时使用
*/
@Override
public void marshal(Object o, HierarchicalStreamWriter hierarchicalStreamWriter, MarshallingContext marshallingContext) {
ResultBean.Information.FilmReview filmReview = (ResultBean.Information.FilmReview) o;
hierarchicalStreamWriter.addAttribute("organization", filmReview.getOrganization());
hierarchicalStreamWriter.addAttribute("film_score", filmReview.getFilm_score());
hierarchicalStreamWriter.setValue(filmReview.getValue());
}
/**
* 将xml转为java对象使用
*/
@Override
public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader, UnmarshallingContext unmarshallingContext) {
ResultBean.Information.FilmReview filmReview = new ResultBean.Information.FilmReview();
//代码顺序必须先getAttribute,然后再getValue,切记
filmReview.setOrganization(hierarchicalStreamReader.getAttribute("organization"));
filmReview.setFilm_score(hierarchicalStreamReader.getAttribute("film_score"));
filmReview.setValue(hierarchicalStreamReader.getValue());
return filmReview;
}
@Override
public boolean canConvert(Class aClass) {
return aClass.equals(ResultBean.Information.FilmReview.class);
}
}
4.解析
public static <T> T parseXML(Class<T> clazz, String str) {
DomDriver domDriver = new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_"));
XStream xStream = new XStream(domDriver);
xStream.processAnnotations(clazz);
T bean = (T) xStream.fromXML(new ByteArrayInputStream(str.getBytes()));
return bean;
}
四、注意事项
1.xml里有的节点,bean类里一定要有;
2.属性名如果和xml节点名称不一样,就需要使用@XStreamAlias注解,否则会报No such field错;
3.节点属性名包含下划线时,会解析不到该节点,可以用以下方式初始化XStream:
DomDriver domDriver = new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_"));
XStream xStream = new XStream(domDriver);
FINALLY:以上代码实测能正常解析,使用的xstream-1.4.7.jar