JAXB功能非常強(qiáng)大,主要是對(duì)java bean到xml之間的互轉(zhuǎn);JAXB的doc比較全面,網(wǎng)址:
http://jaxb.java.net/tutorial/jdk5+已經(jīng)自帶了jaxb的包;應(yīng)該是在rt.jar里;用法也比較簡(jiǎn)單,步驟如下:
1 加入
@XmlRootElement注解,標(biāo)識(shí)xml根節(jié)點(diǎn),默認(rèn)名字是類名,可以加入name屬性來(lái)改名;
@XmlRootElement
public class User{
private String userId;
private String userName;
public String getUserId(){
};
public String getUserName(){
}; 2 加入@XmlElement注解,生成xml中的子節(jié)點(diǎn),其實(shí)可以不加,不加默認(rèn)就是生成,可以指定name修改節(jié)點(diǎn)名
private String userId;
private String userName; @XmlElement
public String getUserId(){
};
public String getUserName(){
}; 3 現(xiàn)在就可以生成xml了,代碼如下:
public class TestJAXB {
@Test
public void bean2XML() throws Exception{
User user = new User();
user.setUserId("id1");
user.setUserName("aaa");
JAXBContext context = JAXBContext.newInstance(user.getClass());
Marshaller m = context.createMarshaller();
StringWriter sw = new StringWriter();
m.marshal(user,sw);
System.out.println(sw.toString());
}
}
4 生成了xml文件,可以轉(zhuǎn)換成bean,比如:
public class TestJAXB {
@Test
public void xml2Bean() throws Exception{
User user = new User();
String xml = "xml字符串";
JAXBContext context = JAXBContext.newInstance(user.getClass());
Unmarshaller um =context.createUnmarshaller();
StringReader sr = new StringReader(xml);
user = (User)um.unmarshal(sr);
System.out.println(user.getUserId());
}
}
簡(jiǎn)單轉(zhuǎn)化就做完了,有幾個(gè)地方:
1 生成xml比較簡(jiǎn)單,如果想把User里的userId和name變成xml根節(jié)點(diǎn)的一個(gè)屬性可用(如果有g(shù)et方法,需要加到get方法上)
@XmlAttribute
String userId;
@XmlAttribute
String userName; 生成的xml類似:
<user userId="id1" userName="aaa">
<!--其他元素內(nèi)容-->
</user>
2 如果想在節(jié)點(diǎn)外面包裹一層,可以用
@XmlElementWrapper(name="wapper" )
@XmlAttribute
private String userName;
生成的xml類似:
<user>
<userId>id1</userId>
<wapper>
<userName>aaa</userName>
</wapper>
<!--其他元素內(nèi)容-->
</user>
3 關(guān)于多態(tài),JAXB也是支持的:有兩種方式
A 通過(guò)@XmlSeeAlso,比如:
@XmlRootElement
public class User{
Person person;
}
@XmlSeeAlso({Man.class, Girl.class})
public class Person{
}
public class Man extends Person{
}
public class Girl extends Person{
}
B 用SeeAlso注解的缺點(diǎn)是:每次加一個(gè)子類都需要修改注解代碼重新編譯,其實(shí)可以直接在JAXBContext.newInstance()中加入這些子類:比如
JAXBContext context = JAXBContext.newInstance(user.getClass(), Man.class, Girl.class);
以上兩種方式都可以把xml Unmarshaller 成java bean;根據(jù)情況任選其一。