使用XStream來映射xml中列表元素到java對象

[size=medium]網上很多講述使用XStream來映射xml文件到java對象的文章,但是幾乎沒有一篇文章講述,如何使用XStream來映射xml中的同級的列表元素到java對象的文章。本文示例中將使用XStream 1.3.1。請去XStream的官方站點上下載相應的包。[/size]

[size=medium]在Eclipse中新建一個Java Project,然後引入XStream的包:xstream-1.3.1.jar和xpp3-min-1.1.4c.jar。在這裏使用xpp的xml解析技術來解析xml,而不是傳統的DOM或者sax來進行xml的解析。[/size]

[size=medium]在src下新建sample.xml文件。代碼如下:[/size]

<?xml version="1.0" encoding="UTF-8"?>
<person id="1" name="sample">
<wife name="wife_name" age="25"></wife>
<house name="house1" address="address1"></house>
<house name="house1" address="address1"></house>
<house name="house1" address="address1"></house>
<house name="house1" address="address1"></house>
</person>


[size=medium]新建House類來映射house元素,House類的源代碼如下:
[/size]


public class House {
private String name = "";
private String address = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}


}


[size=medium]新建Wife類來映射wife標籤,源代碼如下:
[/size]


public class Wife {
private String name = "";
private int 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;
}


}


新建Person類來映射person元素,源代碼如下:

import java.util.List;


public class Person {
private int id;
private String name;
private Wife wife;
private List<House> houseList;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Wife getWife() {
return wife;
}
public void setWife(Wife wife) {
this.wife = wife;
}
public List<House> getHouseList() {
return houseList;
}
public void setHouseList(List<House> houseList) {
this.houseList = houseList;
}
}


[size=medium]新建TestMain方法,包含main方法。首先,構建XStream的實例:
[/size]

XStream xstream = new XStream();


[size=medium]然後,就是配置xml文件和java對象之間的映射,源代碼如下:[/size]

xstream.alias("person", Person.class);
xstream.aliasAttribute(Person.class, "id", "id");
xstream.aliasAttribute(Person.class, "name", "name");

xstream.alias("wife", Wife.class);
xstream.aliasAttribute(Wife.class, "name", "name");

xstream.addImplicitCollection(Person.class, "houseList");
xstream.alias("house", House.class);
xstream.aliasAttribute(House.class,"name", "name");
xstream.aliasAttribute(House.class, "address", "address");

注意代碼中的這句“xstream.addImplicitCollection(Person.class, "houseList");”,如果不加,xml配置文件的house元素將作爲houselist的子元素。將變成

<houseList>
<house name="house1" address="address1"></house>
<house name="house1" address="address1"></house>
<house name="house1" address="address1"></house>
<house name="house1" address="address1"></house>
</houseList>

[size=medium]最後,使用XStream.fromXML來將對應的xml轉化成java對象。代碼如下:[/size]

Person person = (Person)xstream.fromXML(TestMain.class.getClassLoader()
.getResourceAsStream("sample.xml"));

[size=medium]由於sample.xml文件位於classpath下,所以使用了ClassLoader來加載sample.xml。[/size]

[size=medium]測試代碼如下:[/size]

System.out.println("[person.name=" + person.getName() + "]");
System.out.println("[wife.name=" + person.getWife().getName() + ", wife.age=" + person.getWife().getAge() + "]");
System.out.println("[person.houseList.size=" + person.getHouseList().size() + "]");
System.out.println("[person.houseList.house1.name=" + person.getHouseList().get(0).getName() + ",address=" + person.getHouseList().get(0).getAddress() +"]");


[size=medium]測試結果如下:[/size]
[person.name=sample]
[wife.name=wife_name, wife.age=0]
[person.houseList.size=4]
person.houseList.house1.name=house1,address=address1]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章