XStream(可把Javabean转换成XMl的小工具)

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);
    }
}

猜你喜欢

转载自blog.csdn.net/Entermomem/article/details/83992314