Xstream使用的相关细节(javaBean转换成xml文档)

本文介绍使用XStream工具将Java对象序列化为XML的过程,包括定制XML输出、简化标签和忽略字段等技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 导入jar包

jar包:xstream-1.4.7.jar与依赖包xpp3_min-1.1.4c.jar.。

2. 创建javaBean(示例)

//城市类
package cn.yellowimg.demo1;

public class City {
    private String name;//市名
    private String description;
    @Override
    public String toString() {
        return "City [name=" + name + ", description=" + description + "]";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public City() {
        super();
        // TODO Auto-generated constructor stub
    }
    public City(String name, String description) {
        super();
        this.name = name;
        this.description = description;
    }

}
//省类
package cn.yellowimg.demo1;

import java.util.ArrayList;
import java.util.List;

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;
    }
    //创建该方法的原因是方便往cities添加City对象
    public void addCity(City city)
    {
        cities.add(city);
    }
}

3.创建一个国家集合(List<Province>

public class Demo1 {

    public List<Province> getProvinceList()
    {
        List<Province> provinceList = new ArrayList<Province>();

        Province p1 = new Province();
        p1.setName("北京");
        p1.addCity(new City("海淀区","haidian"));
        p1.addCity(new City("朝阳区","chaoyang"));
        provinceList.add(p1);

        return provinceList;
    }

4. 测试类

    @Test
    public void fun1()
    {
        List<Province> provinceList = getProvinceList();

        /**
         * 创建Xstream对象
         * 调用toXMl把集合转换成xml字符串
         */
        XStream xStream = new XStream();

        String xml = xStream.toXML(provinceList);

        System.out.println(xml);
    }

5.运行结果

<list>------->对应provinceList对象
  <cn.yellowimg.demo1.Province>------->对应Province对象
    <name>北京</name>------->对应Province对象的属性name
    <cities>------->对应Province对象的属性cities
      <cn.yellowimg.demo1.City>------->对应City对象
        <name>海淀区</name>------->对应City对象的属性name
            <description>haidian</description>------->对应City对象的属性description
      </cn.yellowimg.demo1.City>
      <cn.yellowimg.demo1.City>
        <name>朝阳区</name>
        <description>chaoyang</description>
      </cn.yellowimg.demo1.City>
    </cities>
  </cn.yellowimg.demo1.Province>
</list>

6.改进需求

  • 将list改为china
  • cn.yellowimg.demo1.Province修改为province
  • cn.yellowimg.demo1.City修改为city。
    @Test
    public void fun2()
    {
        List<Province> provinceList = getProvinceList();

        /**
         * 创建Xstream对象
         * 调用toXMl把集合转换成xml字符串
         */
        XStream xStream = new XStream();


        /**
        *   xStream.alias(String name,Class type)为一个对象类型起别名
        *   name为修改之后的别名,type为对象类型
        */
        xStream.alias("china",List.class);
        xStream.alias("province",Province.class);
        xStream.alias("city",City.class);

        String xml = xStream.toXML(provinceList);

        System.out.println(xml);
    }

结果:

<china>
  <province>
    <name>北京</name>
    <cities>
      <city>
        <name>海淀区</name>
        <description>haidian</description>
      </city>
      <city>
        <name>朝阳区</name>
        <description>chaoyang</description>
      </city>
    </cities>
  </province>
</china>

  • 将province下的name元素变为province的属性
    @Test
    public void fun3()
    {
        List<Province> provinceList = getProvinceList();

        /**
         * 创建Xstream对象
         * 调用toXMl把集合转换成xml字符串
         */
        XStream xStream = new XStream();


        /**
        *   xStream.alias(String name,Class type)为一个对象类型起别名
        *   name为修改之后的别名,type为对象类型
        */
        xStream.alias("china",List.class);
        xStream.alias("province",Province.class);
        xStream.alias("city",City.class);
        /**
        *   xStream.useAttributeFor(Class type,String field);
        *   useAttributeFor()的意思是将某个对象类型的字段变为属性
        */
        xStream.useAttributeFor(Province.class,"name");

        String xml = xStream.toXML(provinceList);

        System.out.println(xml);
    }
<china>
  <province name="北京">
    <cities>
      <city>
        <name>海淀区</name>
        <description>haidian</description>
      </city>
      <city>
        <name>朝阳区</name>
        <description>chaoyang</description>
      </city>
    </cities>
  </province>
</china>

  • 去除无用的集合属性<cities>元素
    @Test
    public void fun4()
    {
        List<Province> provinceList = getProvinceList();

        /**
         * 创建Xstream对象
         * 调用toXMl把集合转换成xml字符串
         */
        XStream xStream = new XStream();

        xStream.alias("china",List.class);
        xStream.alias( "province",Province.class);
        xStream.alias("city",City.class);

        xStream.useAttributeFor(Province.class,"name");
        /**
        * xStream.addImplicitCollection(Class type,String field);
        * 去除无用的集合属性,直接显示list类型里的元素。
        * 我们需要Collection的内容,而不希望Collection本身也成为一个元素
        /
        xStream.addImplicitCollection(Province.class, "cities");

        String xml = xStream.toXML(provinceList);
        System.out.println(xml);
    }
<china>
  <province name="北京">
    <city>
      <name>海淀区</name>
      <description>haidian</description>
    </city>
    <city>
      <name>朝阳区</name>
      <description>chaoyang</description>
    </city>
  </province>
</china>

  • 删除<description>元素
    @Test
    public void fun5()
    {
        List<Province> provinceList = getProvinceList();

        /**
         * 创建Xstream对象
         * 调用toXMl把集合转换成xml字符串
         */
        XStream xStream = new XStream();

        xStream.alias("china",List.class);
        xStream.alias( "province",Province.class);
        xStream.alias("city",City.class);

        xStream.useAttributeFor(Province.class,"name");

        xStream.addImplicitCollection(Province.class, "cities");

        /**
        * xStream.omitField(Class type, String field);
        * 忽略对象中的某个属性。
        */
        xStream.omitField(City.class, "description");

        String xml = xStream.toXML(provinceList);
        System.out.println(xml);
    }
<china>
  <province name="北京">
    <city>
      <name>海淀区</name>
    </city>
    <city>
      <name>朝阳区</name>
    </city>
  </province>
</china>

大功告成!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值