Java學習--xml文字轉換成Java物件

輕舟輕發表於2018-07-10

最近在做專案中用到XML,期間遇到了很多的問題,個人總結一下,歡迎指正。

XML文字以及標註。

<person>    【《一級標籤》 對應PersonBean類,而且PersonBean類用@XStreamAlias("person")修飾。】
<firstName>chen</firstName>	【《沒有子標籤,直接在PersonBean類中定義》】
<lastName>youlong</lastName>
<telphone>	【《二級標籤(內部的元素不是以列表的形式存在)》 對應PhoneNumber資料類,在定義telphone這個欄位的時有兩種方法分別是(private PhoneNumber telphone;(此變數的命名一定和xml中欄位名相同)或者@XStreamAlias("telphone") private PhoneNumber tel;(用註解的方法標註欄位名,變數名就可以隨意了))】
    <code>137280</code>
    <number>137280968</number>
</telphone>
<faxphone>
    <code>20</code>
    <number>020221327</number>
</faxphone>
<friends>	【《三級標籤(內部中的元素以列表的形式存在)》 對應Friends類。在Friends類中需要宣告一個列表,並使用@XStreamImplicit(itemFieldName="name")註解標註標籤中重複的元素 】
    <name>A1</name>
    <name>A2</name>
    <name>A3</name>
</friends>
<pets>	【《三級標籤(含有四級標籤,並且四級標籤中的元素是以列表的形式存在)》 對應Pets類,並且在Pets類中以列表的形式宣告出Pet標籤(@XStreamImplicit(itemFieldName="pet")(此註解宣告‘pet’標籤)private List<Pet> petList;)Pet類含有pet標籤下的元素 】
    <pet>
        <name>doly</name>
        <age>2</age>
    </pet>
    <pet>
        <name>Ketty</name>
        <age>2</age>
    </pet>"+
</pets>
</person>

具體程式碼:

PersonBean類,主要宣告《person》一級標籤下的元素

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("person")
public class PersonBean {
	
	
    private String firstName;
    private String lastName;
    private PhoneNumber telphone;
    private PhoneNumber faxphone;
 //   @XStreamAlias("friends")
    private Friends friends;
 //   @XStreamAlias("pets")
    private Pets pets;		//

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public PhoneNumber getTel() {
		return telphone;
	}

	public void setTel(PhoneNumber tel) {
		this.telphone = tel;
	}

	public PhoneNumber getFax() {
		return faxphone;
	}

	public void setFax(PhoneNumber fax) {
		this.faxphone = fax;
	}

	public Friends getFriend() {
		return friends;
	}

	public void setFriend(Friends friend) {
		this.friends = friend;
	}

	public Pets getPet() {
		return pets;
	}

	public void setPet(Pets pet) {
		this.pets = pet;
	}
}

Pets類,宣告二級標籤pets下的元素

import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamImplicit;

public class Pets {

	@XStreamImplicit(itemFieldName="pet")
    private List<Pet> petList;
     
    public List<Pet> getAnimalList() {
        return petList;
    }

    public void setAnimalList(List<Pet> animalList) {
        this.petList = animalList;
    }
}

pet類,宣告三級標籤下pet中的元素util.List;

public class Pet {
	
    private String name;
    private int age;
    
//    public Pet() {
//    	
//    }
    
//    public Pet(String name,int age){
//        this.name=name;
//        this.age=age;
//    }
    
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
}

Friends類,宣告friend二級標籤中的元素,friends標籤下的元素是以列表的形式存在的

import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamImplicit;

public class Friends {

    @XStreamImplicit(itemFieldName="name")
    private List<String> name;
	 
     public List<String> getName() {
         return name;
     }

     public void setName(List<String> name) {
         this.name = name;
     }
}

PhoneNumber 類是宣告telphone和faxphone下的元素。

public class PhoneNumber {

    private int code;
    private String number;
    public int getCode() {
	return code;
    }
	
    public void setCode(int code) {
	this.code = code;
    }
	
    public String getNumber() {
	return number;
    }
	
    public void setNumber(String number) {
	this.number = number;
    }
}

XmlUtil 類是具體的操作類

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class XmlUtil {

	 /**
     * java 轉換成xml
     * @Title: toXml 
     * @Description: TODO 
     * @param obj 物件例項
     * @return String xml字串
     */
	 public static String toXml(Object obj) {
         XStream xstream=new XStream();
//       XStream xstream=new XStream(new DomDriver()); //直接用jaxp dom來解釋
//       XStream xstream=new XStream(new DomDriver("utf-8")); //指定編碼解析器,直接用jaxp dom來解釋
          
         ////如果沒有這句,xml中的根元素會是<包.類名>;或者說:註解根本就沒生效,所以的元素名就是類的屬性
         xstream.processAnnotations(obj.getClass()); //通過註解方式的,一定要有這句話
         return xstream.toXML(obj);
     }
	 
	 /**
      *  將傳入xml文字轉換成Java物件
      * @Title: toBean 
      * @Description: TODO 
      * @param xmlStr
      * @param cls  xml對應的class類
      * @return T   xml對應的class類的例項物件
      * 
      * 呼叫的方法例項:PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
      */
	 @SuppressWarnings("unchecked")
     public static <T> T  toBean(String xmlStr,Class<T> cls){
         //注意:不是new Xstream(); 否則報錯:java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserFactory
         XStream xstream=new XStream(new DomDriver());
         xstream.processAnnotations(cls);
         T obj=(T)xstream.fromXML(xmlStr);
         return obj;         
     }
     public static void main(String[] args) {
		 String xmlStr="<person>"+
	             "<firstName>chen</firstName>"+
	             "<lastName>youlong</lastName>"+
	             "<telphone>"+
	               "<code>137280</code>"+
	               "<number>137280968</number>"+
	             "</telphone>"+
	             "<faxphone>"+
	               "<code>20</code>"+
	               "<number>020221327</number>"+
	             "</faxphone>"+
	             "<friends>"+
	               "<name>A1</name>"+
	               "<name>A2</name>"+
	               "<name>A3</name>"+
	             "</friends>"+
	             "<pets>"+
	               "<pet>"+
	                 "<name>doly</name>"+
	                 "<age>2</age>"+
	               "</pet>"+
	               "<pet>"+
	                 "<name>hahah</name>"+
	                 "<age>3</age>"+
	               "</pet>"+
	             "</pets>"+
	           "</person>";
		 
		//用泛型的知識
	   System.out.println("xmlStr: \n" + xmlStr);
	   System.out.println();
	   PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);
	   System.out.println("person=firstname=="+person.getFirstName());
	   System.out.println("person==Friends==name1=="+person.getFriend().getName());
	   System.out.println("person==Pets==name2=="+person.getPet().getAnimalList().get(1).getName());
	}
}

相關文章