Java之將Javabean轉換為xml並進行xml標簽的相關操作


簡介

java自帶的jar包中並不支持Javabean和xml的轉換

所以是首先要使用的兩個jar包:

Javabean和xml的轉換是XStream中的類和方法,而使用XStream就必須依賴xpp3jar包;

XStream網上都能下載,下面是下載xpp3的網址,但是原網址被廢棄了,存檔一般是進不去的

http://www.extreme.indiana.edu/xgws/xsoap/xpp/

百度上搜了下,很多下載xpp3都要收費的,這里作為學習交流提供XStream和xpp3的jar包:

鏈接:https://pan.baidu.com/s/1PYfE3yiYdXEHVFUeaa6SSw?pwd=8080 提取碼:8080

 

然后就是創建java工程和導入jar包了,導包可以參照:

https://www.cnblogs.com/0099-ymsml/p/16062244.html

 

應用:

javabean和xml的轉換需要使用toXml()方法:

 

public String toXML(Object obj) { Writer writer = new StringWriter(); toXML(obj, writer); return writer.toString(); }

 

 

public void toXML(Object obj, Writer out) { HierarchicalStreamWriter writer = hierarchicalStreamDriver.createWriter(out); try { marshal(obj, writer); } finally { writer.flush(); } }

 

 

public void marshal(Object obj, HierarchicalStreamWriter writer) { marshal(obj, writer, null); }

 

public void marshal(Object obj, HierarchicalStreamWriter writer, DataHolder dataHolder) { marshallingStrategy.marshal(writer, obj, converterLookup, mapper, dataHolder);    }

上面就是XStream中的toXml()方法,

太多了懶得分析,返回的是一個xml形式的字符串。

使用toXml():

首先需要創建標准Java類:

import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * @author CDU_LM * 省份類 */
public class Province { private String name;     // 名稱
    private List<City> cities = new ArrayList<City>(); public Province(String name, List<City> cities) { this.name = name; this.cities = cities; } public Province() { // TODO Auto-generated constructor stub
 } 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; } @Override public int hashCode() { return Objects.hash(cities, name); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Province other = (Province) obj; return Objects.equals(cities, other.cities) && Objects.equals(name, other.name); } @Override public String toString() { return "Province [name=" + name + ", cities=" + cities + "]"; } public void addCity(City city) { this.cities.add(city); } }

 

import java.util.Objects; // 城市類
public class City { private String name;    // 名稱
    private String descript;    // 描述
    public City(String name, String descript) { this.name = name; this.descript = descript; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescript() { return descript; } public void setDescript(String descript) { this.descript = descript; } @Override public int hashCode() { return Objects.hash(descript, name); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; City other = (City) obj; return Objects.equals(descript, other.descript) && Objects.equals(name, other.name); } @Override public String toString() { return "Province [name=" + name + ", descript=" + descript + "]"; } }

然后是創建一個@Test測試類:

import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.thoughtworks.xstream.XStream; // 測試類
public class JavaToXml { // 返回javabean集合
    public List<Province> getProvinceList(){ Province p1 = new Province();    // 創建省1
        p1.setName("北京");    // 省份名稱
        p1.addCity(new City("東城區","dcq"));    // 添加城市
        p1.addCity(new City("西城區","xcq"));    // 添加城市
        p1.addCity(new City("北城區","bcq"));    // 添加城市
 Province p2 = new Province();    // 創建省2
        p2.setName("四川");    // 省份名稱
        p2.addCity(new City("簡陽","jy"));    // 添加城市
        p2.addCity(new City("成都","cd"));    // 添加城市
        p2.addCity(new City("綿陽","my"));    // 添加城市
 List<Province> provinceList = new ArrayList<>();    // 創建集合
        provinceList.add(p1);    // 添加元素p1
        provinceList.add(p2);    // 添加元素p2
        
        return provinceList; } @SuppressWarnings("resource") @Test public void fun1() { List<Province> proList = getProvinceList(); /** * 創建XStream對象 * 調用toXML()方法把集合轉換為字符串 */ XStream xs = new XStream(); String s = "<?xml version='1.0' encoding='utf-8'?>\n"; s +=xs.toXML(proList); System.out.print(s); try { PrintStream print = new PrintStream("D:" + File.separator + "toXml.xml"); print.print(s); print.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } } }

運行這個測試類:

 

<?xml version='1.0' encoding='utf-8'?>
<list>
  <toXml.Province>
    <name>北京</name>
    <cities>
      <toXml.City>
        <name>東城區</name>
        <descript>dcq</descript>
      </toXml.City>
      <toXml.City>
        <name>西城區</name>
        <descript>xcq</descript>
      </toXml.City>
      <toXml.City>
        <name>北城區</name>
        <descript>bcq</descript>
      </toXml.City>
    </cities>
  </toXml.Province>
  <toXml.Province>
    <name>四川</name>
    <cities>
      <toXml.City>
        <name>簡陽</name>
        <descript>jy</descript>
      </toXml.City>
      <toXml.City>
        <name>成都</name>
        <descript>cd</descript>
      </toXml.City>
      <toXml.City>
        <name>綿陽</name>
        <descript>my</descript>
      </toXml.City>
    </cities>
  </toXml.Province>
</list>

可以發現這個運行結果去掉第一行人為添加的后:

根元素<list>:使用的List接口集合類型,如果是使用其它的集合類型就是對應的類型名稱

下面的<toXml.Province>:包.省份類名

<toXml.Province>下面的<name>:Province 的第一個成員屬性

<toXml.Province>下面的<cities>:Province 的第二個成員屬性

<toXml.City> :包.城市類名

<toXml.City> 下面的<name>:City的第一個成員屬性

<toXml.City> 下面的<descript>:City的第二個成員屬性

那么結構就是這樣了,成功地將Java類轉換為了xml的形式。

然后在文件路徑中有:

 

 

打開后:

 

如果打開報錯,可能是編碼的問題,可以在:

 

 

 

 

選擇utf-8,建議寫代碼之前就換一下,因為默認的是gbk格式,在轉換為utf-8后會導致中文亂碼;

 

在程序開發中建議的也是utf-8格式。

 

給默認的標簽起別名:

上面我們發現 得出結果的xml數據的標簽是根據包和類來定義的,看着很不規律或整齊,所以可以使用XStream中的alias()方法

 首先看看alias()方法的代碼:

classAliasingMapper 是 類別名映射器

public void alias(String name, Class type) { if (classAliasingMapper == null) { throw new com.thoughtworks.xstream.InitializationException("No "
                + ClassAliasingMapper.class.getName() + " available"); } classAliasingMapper.addClassAlias(name, type); }

 如果classAliasingMapper 不為空,那么就執行addClassAlias()方法

public void addClassAlias(String name, Class type) { nameToType.put(name, type.getName()); classToName.put(type.getName(), name); }

addClassAlias()方法中可以發現,和Map集合有了聯系。

private final Map classToName = new HashMap(); private transient Map nameToType = new HashMap()
put()方法就相當於在給classToName和nameToType賦值

想要深究的可以去看源碼

@Test public void fun2() { List<Province> proList = getProvinceList(); XStream xs = new XStream(); xs.alias("china", List.class);            // List類型別名為china
        xs.alias("province", Province.class);    // Province類型別名為province
        xs.alias("city", City.class);            // City類型別名為city
 String s = "<?xml version='1.0' encoding='utf-8'?>\n"; s +=xs.toXML(proList); System.out.print(s); }

 運行結果:

<?xml version='1.0' encoding='utf-8'?>
<china>
  <province>
    <name>北京</name>
    <cities>
      <city>
        <name>東城區</name>
        <descript>dcq</descript>
      </city>
      <city>
        <name>西城區</name>
        <descript>xcq</descript>
      </city>
      <city>
        <name>北城區</name>
        <descript>bcq</descript>
      </city>
    </cities>
  </province>
  <province>
    <name>四川</name>
    <cities>
      <city>
        <name>簡陽</name>
        <descript>jy</descript>
      </city>
      <city>
        <name>成都</name>
        <descript>cd</descript>
      </city>
      <city>
        <name>綿陽</name>
        <descript>my</descript>
      </city>
    </cities>
  </province>
</china>

這樣就可以使對應的標簽變成自定義標簽名稱;

 

將某個類的成員屬性變為xml中標簽的屬性:

/** * 默認子元素是java類的成員屬性 * 現在需要將某些java類的成員屬性變為標簽的屬性 */ @Test public void fun3() { List<Province> proList = getProvinceList(); XStream xs = new XStream(); xs.alias("china", List.class);            // List類型別名為china
        xs.alias("province", Province.class);    // Province類型別名為province
        xs.alias("city", City.class);            // City類型別名為city
        
        /** * 把Pprovince類型的name屬性變為<province>標簽的屬性 */ xs.useAttributeFor(Province.class,"name");    // 將Province類的name成員屬性變為xml中的標簽屬性
 String s = "<?xml version='1.0' encoding='utf-8'?>\n"; s +=xs.toXML(proList); System.out.print(s); }

運行結果:

</china><?xml version='1.0' encoding='utf-8'?>
<china>
  <province name="北京">
    <cities>
      <city>
        <name>東城區</name>
        <descript>dcq</descript>
      </city>
      <city>
        <name>西城區</name>
        <descript>xcq</descript>
      </city>
      <city>
        <name>北城區</name>
        <descript>bcq</descript>
      </city>
    </cities>
  </province>
  <province name="四川">
    <cities>
      <city>
        <name>簡陽</name>
        <descript>jy</descript>
      </city>
      <city>
        <name>成都</name>
        <descript>cd</descript>
      </city>
      <city>
        <name>綿陽</name>
        <descript>my</descript>
      </city>
    </cities>
  </province>

可以發現Province類下的name成員屬性變為了標簽<province>中的屬性

 

 

使某個類中的某個成員屬性不顯示在xml的標簽中:

換一種說法就是只是將集合中(不包括集合名本身)的元素生成xml標簽

@Test public void fun4() { List<Province> proList = getProvinceList(); XStream xs = new XStream(); xs.alias("china", List.class);            // List類型別名為china
        xs.alias("province", Province.class);    // Province類型別名為province
        xs.alias("city", City.class);            // City類型別名為city
        xs.useAttributeFor(Province.class,"name");    // 將Province類的name成員屬性變為xml中的標簽屬性
        
        /** * 去掉<cities>這樣的集合類型屬性 */ xs.addImplicitCollection(Province.class, "cities");    // 使Province類中的cities不顯示在xml標簽中
 String s = "<?xml version='1.0' encoding='utf-8'?>\n"; s +=xs.toXML(proList); System.out.print(s); }

運行結果:

<?xml version='1.0' encoding='utf-8'?>
<china>
  <province name="北京">
    <city>
      <name>東城區</name>
      <descript>dcq</descript>
    </city>
    <city>
      <name>西城區</name>
      <descript>xcq</descript>
    </city>
    <city>
      <name>北城區</name>
      <descript>bcq</descript>
    </city>
  </province>
  <province name="四川">
    <city>
      <name>簡陽</name>
      <descript>jy</descript>
    </city>
    <city>
      <name>成都</name>
      <descript>cd</descript>
    </city>
    <city>
      <name>綿陽</name>
      <descript>my</descript>
    </city>
  </province>
</china>

上面的xml就去掉了<cities>這個標簽。

 

使用某些javabean屬性不生成為xml標簽:

@Test public void fun5() { List<Province> proList = getProvinceList(); XStream xs = new XStream(); xs.alias("china", List.class);            // List類型別名為china
        xs.alias("province", Province.class);    // Province類型別名為province
        xs.alias("city", City.class);            // City類型別名為city
        xs.useAttributeFor(Province.class,"name");    // 將Province類的name成員屬性變為xml中的標簽屬性
        xs.addImplicitCollection(Province.class, "cities");    // 使Province類中的cities不顯示在xml標簽中
        
        /** * 使某些類的某個屬性不生成對應的xml標簽 */ xs.omitField(City.class,"descript"); String s = "\n<?xml version='1.0' encoding='utf-8'?>\n"; s +=xs.toXML(proList); System.out.print(s); }

運行結果:

<?xml version='1.0' encoding='utf-8'?>
<china>
  <province name="北京">
    <city>
      <name>東城區</name>
    </city>
    <city>
      <name>西城區</name>
    </city>
    <city>
      <name>北城區</name>
    </city>
  </province>
  <province name="四川">
    <city>
      <name>簡陽</name>
    </city>
    <city>
      <name>成都</name>
    </city>
    <city>
      <name>綿陽</name>
    </city>
  </province>
</china>

 這樣xml中的<descript>標簽就不會生成了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM