1. 程式人生 > >XStream(可把Javabean轉換成XMl的小工具)

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