XStream
1、作用
把JavaBean转换为(序列化)xml
2、XStream的jar包
核心JAR包:xstream-1.4.x.jar
必须依赖包:xpp3_min-1.1.4c(XML Pull Parser速度很快的XML解析器)
3、使用步骤
XStream xstream = new XStream();
String xmlStr = xstream.toXML(javabean);
4、使用细节
别名:把类型对应的元素名修改
xstream.alias("china",List.class);让List类型生成的元素名为china
xstream.alias("province",Province.class):让Province类生成的元素名为province
使用为属性:默认类的成员,生成的是元素的子元素。希望让类的成员生成元素的属性
xstream.useAttributeFor(Province.class,"name"):把Province类的名为name成员,生成<province>元素的name属性
去除集合Collection类型的成员:只需要Collection的内容,而不希望Collection本身也生成一个元素
xstream.addImplicitCollection(Province.class,"cities"):让Province类的名为cities(是List类型的,内容还会生成元素)的成员不生成元素
去除类的指定成员,让其不生成xml元素
xstream.omitField(City.class,"description"):在生成的xml中不会出现City类的。名为description的对应的元素
用到的jar
xpp3_min-1.1.3.4.O.jar
xstream-1.4.7.jar
public class Demo1 {
public List<Province> getProvinceList(){
Province p1 = new Province();
p1.setName("山东");
p1.addCity(new City("青岛","qingdao"));
p1.addCity(new City("济南","jinan"));
Province p2 = new Province();
p2.setName("湖北");
p2.addCity(new City("随州","suizhou"));
p2.addCity(new City("武汉 "," wuhan"));
List<Province> provinceList = new ArrayList<Province>();
provinceList.add(p1);
provinceList.add(p2);
return provinceList;
}
/*
fun() 输出结果:
<list> --> List类型显示为list
<com.lingnet.demo.Province> -->javabean类型为Province,元素的名称为类的完整名
<name>山东</name> -->javabean的属性名
<cities> -->javabean的属性名
<com.lingnet.demo.City> -->类名
<name>青岛</name> -->属性名
<description>qingdao</description> -->属性名
</com.lingnet.demo.City>
<com.lingnet.demo.City>
<name>济南</name>
<description>jinan</description>
</com.lingnet.demo.City>
</cities>
</com.lingnet.demo.Province>
<com.lingnet.demo.Province>
<name>湖北</name>
<cities>
<com.lingnet.demo.City>
<name>随州</name>
<description>suizhou</description>
</com.lingnet.demo.City>
<com.lingnet.demo.City>
<name>武汉 </name>
<description> wuhan</description>
</com.lingnet.demo.City>
</cities>
</com.lingnet.demo.Province>
</list>
*/
// @Test
public void fun(){
List<Province> proList = getProvinceList();
/*
* 创建XStream对象
* 调用toXML把集合转换成xml字符串
*/
XStream xStream = new XStream();
String s = xStream.toXML(proList);
System.out.println(s);
}
/*
* 别名(alias)
* 希望:
* 默认List类型对应<list>元素,希望让List类型对应<china>元素
* 默认Province类型对应<my.demo.Province>希望让它对应<province>
* 默认city类型对应<my.demo.City>希望它对应<city>元素
*/
/*
<china>
<province>
<name>山东</name>
<cities>
<city>
<name>青岛</name>
<description>qingdao</description>
</city>
<city>
<name>济南</name>
<description>jinan</description>
</city>
</cities>
</province>
<province>
<name>湖北</name>
<cities>
<city>
<name>随州</name>
<description>suizhou</description>
</city>
<city>
<name>武汉 </name>
<description> wuhan</description>
</city>
</cities>
</province>
</china>
*/
// @Test
public void fun2(){
List<Province> proList = getProvinceList();
XStream xstream = new XStream();
/*
* 给指定的类型指定别名
*/
xstream.alias("china",List.class);//给list类型指定别名china
xstream.alias("province", Province.class);//给Province指定别名
xstream.alias("city", City.class);//给City类型指定别名为city
String s = xstream.toXML(proList);
System.out.println(s);
}
// 默认javabean的属性都会生成子元素,而现在希望生成元素的属性
/*
<china>
<province name="山东">
<cities>
<city>
<name>青岛</name>
<description>qingdao</description>
</city>
<city>
<name>济南</name>
<description>jinan</description>
</city>
</cities>
</province>
<province name="湖北">
<cities>
<city>
<name>随州</name>
<description>suizhou</description>
</city>
<city>
<name>武汉 </name>
<description> wuhan</description>
</city>
</cities>
</province>
</china>
*/
// @Test
public void fun3(){
List<Province> proList = getProvinceList();
XStream xstream = new XStream();
xstream.alias("china",List.class);//给list类型指定别名china
xstream.alias("province", Province.class);//给Province指定别名
xstream.alias("city", City.class);//给City类型指定别名为city
/*
* 把Province类的name属性,生成<province>元素的属性
*/
xstream.useAttributeFor(Province.class,"name");
String s = xstream.toXML(proList);
System.out.println(s);
}
// 去除List类型的属性,只把List中的元素生成xml元素
/*
<china>
<province name="山东">
<city>
<name>青岛</name>
<description>qingdao</description>
</city>
<city>
<name>济南</name>
<description>jinan</description>
</city>
</province>
<province name="湖北">
<city>
<name>随州</name>
<description>suizhou</description>
</city>
<city>
<name>武汉 </name>
<description> wuhan</description>
</city>
</province>
</china>
*/
// @Test
public void fun4(){
List<Province> proList = getProvinceList();
XStream xstream = new XStream();
xstream.alias("china",List.class);//给list类型指定别名china
xstream.alias("province", Province.class);//给Province指定别名
xstream.alias("city", City.class);//给City类型指定别名为city
xstream.useAttributeFor(Province.class,"name");//把Province类的name属性,生成<province>元素的属性
/*
* 去除<cities>这样的Collection类型的属性
* 取出Province类的名为cities的List类型的属性
*/
xstream.addImplicitCollection(Province.class, "cities");
String s = xstream.toXML(proList);
System.out.println(s);
}
// 去除不想要的javabean属性, 就是让某些javabean属性,不生成对应的xml元素
/*
<china>
<province name="山东">
<city>
<name>青岛</name>
</city>
<city>
<name>济南</name>
</city>
</province>
<province name="湖北">
<city>
<name>随州</name>
</city>
<city>
<name>武汉 </name>
</city>
</province>
</china>
*/
@Test
public void fun5(){
List<Province> proList = getProvinceList();
XStream xstream = new XStream();
xstream.alias("china",List.class);//给list类型指定别名china
xstream.alias("province", Province.class);//给Province指定别名
xstream.alias("city", City.class);//给City类型指定别名为city
xstream.useAttributeFor(Province.class,"name");//把Province类的name属性,生成<province>元素的属性
xstream.addImplicitCollection(Province.class, "cities");//去除Province类的名为cities的List类型的属性
/*
* 让City类的,名为description属性不生成对应的xml元素
*/
xstream.omitField(City.class, "description");
String s = xstream.toXML(proList);
System.out.println(s);
}
}
public class City {
private String name;
private String description;
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public City(String name, String description) {
super();
this.name = name;
this.description = description;
}
public City(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "City [name=" + name + ", description=" + description + "]";
}
public City() {
super();
// TODO Auto-generated constructor stub
}
}
public class Province {
private String name;
private List<City> cities = new ArrayList<City>();
public Province() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Province [name=" + name + ", cities=" + cities + "]";
}
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 Province(String name, List<City> cities) {
super();
this.name = name;
this.cities = cities;
}
public void addCity(City city){
cities.add(city);
}
}