1、什么作用
将JavaBean转换为(序列化)为xml。这样就可以和ajax技术对接上,服务器可以将对象转换成xml,在使用ajax技术发送给客户端。
2、使用jar包
- 核心jar包:stream-1.4.7.jar
- 必须依赖包:xpp3_min-1.1.4c.jar (XML pull parser: 一款速度很快的xml解析器)
3、使用步骤
- XStream xstream=new XStream();
- String xmlStr=xstream.toXML(javabean);
案例:
City.java
public class City {
private String name; //市名
private String desctiption; //描述
public String getName() {
return name;
}
public City(String name, String desctiption) {
super();
this.name = name;
this.desctiption = desctiption;
}
public void setName(String name) {
this.name = name;
}
public String getDesctiption() {
return desctiption;
}
public void setDesctiption(String desctiption) {
this.desctiption = desctiption;
}
@Override
public String toString() {
return "City [name=" + name + ", desctiption=" + desctiption + "]";
}
Province.java
public class Province {
private String name; //省名
private List<City> cities=new ArrayList<City>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<City> getCities() {
return cities;
}
public void setCities(List<City> cities) {
this.cities = cities;
}
public void addCity(City city){
cities.add(city);
}
Test.java
public class Demo1 {
//返回javabean集合
public List<Province> getProvinceList(){
Province p1=new Province();
p1.setName("北京");
p1.addCity(new City("东城区","dongchengqu"));
p1.addCity(new City("昌平区","changpingqu"));
Province p2=new Province();
p2.setName("辽宁");
p2.addCity(new City("葫芦头","huloutou"));
p2.addCity(new City("沈阳","shengyang"));
List<Province> ps=new ArrayList<Province>();
ps.add(p1);
ps.add(p2);
return ps;
}
@Test
public void fun(){
List<Province> ps=getProvinceList();
XStream xStream = new XStream();//创建XStream对象
String s=xStream.toXML(ps);//调用toXML把集合转换成xml字符集
System.out.println(s);
}
执行结果:
<list> //List类型显示list
<cn.itcast.xstream.Province> //javabean的类型,显示它类的完整名
<name>北京</name> //javabean的属性名
<cities>
<cn.itcast.xstream.City> //类名
<name>东城区</name> //属性名
<desctiption>dongchengqu</desctiption>
</cn.itcast.xstream.City>
<cn.itcast.xstream.City>
<name>昌平区</name>
<desctiption>changpingqu</desctiption>
</cn.itcast.xstream.City>
</cities>
</cn.itcast.xstream.Province>
<cn.itcast.xstream.Province>
<name>辽宁</name>
<cities>
<cn.itcast.xstream.City>
<name>葫芦头</name>
<desctiption>huloutou</desctiption>
</cn.itcast.xstream.City>
<cn.itcast.xstream.City>
<name>沈阳</name>
<desctiption>shengyang</desctiption>
</cn.itcast.xstream.City>
</cities>
</cn.itcast.xstream.Province>
</list>
改善:
1、给标签起别名(alias):xstream.alias("别名",对象.class)
- 默认List类型对应的元素,希望让List类型对应<china>
元素
- 默认Province类型为<cn.itcast.demo.Province>
,希望让它对应
- 默认City类型对应<cn.itcast.demo1.City>
,希望它对应<city>
元素。
给指定的类型指定别名
xstream.alias("china",List.class); //给List类型指定别名为China
xstream.alias("province",Province.class); //给Province类型指定别名为province
xstream.alias("city",City.class); //给City类型指定别名为city
String s=xstream.toXML(ps);
2、将类型属性转换成标签属性
* 把Province类型的属性,生成<province>
元素的属性。
xstream.userAttributeFor(Province.class,"name"); //将类型属性转化成标签属性
3、去除Collection类型的成员:只需要Collection的内容,不希望类的成员生成元素的属性
xstram.addImplicitCollection(Province.class,"cities");//让Provice类的名为cities(它是List类型,他的内容还会生成元素)的成员不生成元素
4、去除类的指定成员:让其不生成xml元素
xstream.omitField(City.class,"description") //在生成的xml中不出出现City类的名为description的对应的元素。
最终结果:
<china>
<province name="北京">
<city>
<name>东城区</name>
</city>
<city>
<name>昌平区</name>
</city>
</province>
<province name="辽宁">
<city>
<name>葫芦头</name>
</city>
<city>
<name>沈阳</name>
</city>
</province>
</china>