Posted on 2011-06-03 12:04
landor 阅读(284)
评论(0)
编辑
收藏 所属分类:
XML

<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description rdf:about="http://www.blogjava.net/landor2004/archive/2011/06/03/351656.html" dc:identifier="http://www.blogjava.net/landor2004/archive/2011/06/03/351656.html" dc:title="JAXB2完成java bean到xml的相互转换" trackback:ping="http://www.blogjava.net/landor2004/services/trackbacks/351656.aspx" /> </rdf:RDF> -->
JAXB功能非常强大,主要是对java bean到xml之间的互转;JAXB的doc比较全面,网址:
http://jaxb.java.net/tutorial/
jdk5+已经自带了jaxb的包;应该是在rt.jar里;用法也比较简单,步骤如下:
1 加入
@XmlRootElement注解,标识xml根节点,默认名字是类名,可以加入name属性来改名;
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
@XmlRootElement
public
class
User{
private
String userId;
private
String userName;
public
String getUserId(){
};
public
String getUserName(){
};
2 加入@XmlElement注解,生成xml中的子节点,其实可以不加,不加默认就是生成,可以指定name修改节点名
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
private String userId;
private
String userName;
@XmlElement
public
String getUserId(){};
public
String getUserName(){};
3 现在就可以生成xml了,代码如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
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文件,可以转换成bean,比如:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
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());
}
}
简单转化就做完了,有几个地方:
1 生成xml比较简单,如果想把User里的userId和name变成xml根节点的一个属性可用(如果有get方法,需要加到get方法上)
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
@XmlAttribute
String userId;
@XmlAttribute
String userName;
生成的xml类似:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
<
user
userId
="id1"
userName
="aaa"
>
<!--
其他元素内容
-->
</
user
>
2 如果想在节点外面包裹一层,可以用
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
@XmlElementWrapper(name
=
"
wapper
"
)
@XmlAttribute
private
String userName;
生成的xml类似:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
<
user
>
<
userId
>
id1
</
userId
>
<
wapper
>
<
userName
>
aaa
</
userName
>
</
wapper
>
<!--
其他元素内容
-->
</
user
>
3 关于多态,JAXB也是支持的:有两种方式
A 通过@XmlSeeAlso,比如:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
@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注解的缺点是:每次加一个子类都需要修改注解代码重新编译,其实可以直接在JAXBContext.newInstance()中加入这些子类:比如
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
JAXBContext context
=
JAXBContext.newInstance(user.getClass(), Man.
class
, Girl.
class
);
以上两种方式都可以把xml Unmarshaller 成java bean;根据情况任选其一。