JAXB是Java Architecture for XML Binding的缩写。提供了一个快速便捷的方式将Java对象与XML进行转换。在JAX-WS(Java的WebService规范之一)中,JDK1.6自带的版本JAX-WS2.1,其底层支持就是JAXB。
JAXB可以实现对象和XML之间相互转换。Unmarshaller类管理将XML数据反序列化为新创建的Java内容树的进程,并可在解组时有选择的验证XML数据。Marshaller类负责管理将Java内容树序列化回XML数据的过程。
常用注解
@XmlRootElement
注解说明:将类或枚举类型映射到XML元素
使用范围:顶层类,枚举类型
属性说明:name:XML元素的本地名称,namespace:XML元素的名称空间名
例:
对象转XML类:
@XmlRootElement(name = "acc", namespace = "www.wang.com") // 根节点名称是acc,命名空间www.wang.com,如果没有@XmlRootElement,默认节点名称和类名名称相同
public class Account {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试类:public class AccountTest {
public static void main(String[] args) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(Account.class);
Marshaller marshaller = jaxbContext.createMarshaller();
// 用来指定是否使用换行和缩排对已编组XML数据进行格式化的属性名称
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// 用来指定将放置在已编组 XML 输出中的 xsi:schemaLocation 属性值的属性名称
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "s");
// 用来指定将放置在已编组 XML 输出中的 xsi:noNamespaceSchemaLocation 属性值的属性名称
marshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, "w");
Account acc = new Account();
acc.setId("0001");
acc.setName("张三");
marshaller.marshal(acc, System.out);
}
}
输出结果:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:acc xmlns:ns2="www.wang.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="s" xsi:noNamespaceSchemaLocation="w">
<id>0001</id>
<name>张三</name>
</ns2:acc>
@XmlElement注解说明:将JavaBean属性映射到派生于属性名称的XML元素
使用范围:JavaBean属性、非static、非transient字段、XmlElements中的程序元素
属性说明:defaultValue:此元素的默认值,name:XML模式元素的名称,namespace:XML模式元素的XML目标名称空间,nillable:是否可以为空,默认false,required:如果 required() 为 true,则将 Javabean 属性映射到一个 minOccurs="1" 的 XML 模式元素声明。maxOccurs 为 "1" 表示单个赋值的属性,maxOccurs 为 "unbounded" 则表示多个赋值的属性。如果 required() 为 false,则将 Javabean 属性映射到一个 minOccurs="0" 的 XML 模式元素声明。maxOccurs 为 "1" 表示单个赋值的属性,maxOccurs 为 "unbounded" 则表示多个赋值的属性。
对象转XML类:
@XmlRootElement
public class Account {
private String id;
private String name;
private BigDecimal price;
@XmlElement(name = "accId")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement(name = "accPrice", nillable = true)
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
}
测试类:public class AccountTest {
public static void main(String[] args) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(Account.class);
Marshaller marshaller = jaxbContext.createMarshaller();
// 用来指定是否使用换行和缩排对已编组XML数据进行格式化的属性名称
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Account acc = new Account();
acc.setId("0001");
acc.setName("张三");
acc.setPrice(new BigDecimal(132000.00));
marshaller.marshal(acc, System.out);
}
}
输出结果:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<account>
<accId>0001</accId>
<name>张三</name>
<accPrice>132000</accPrice>
</account>
疑问:输出结果和JDK文档中的XML样式不一样,很是奇怪,@XmlElement(name = "accPrice", nillable = true)在xml中没有nillable属性@XmlElements
注解说明:多个@XmlElement注解的容器,此注解用于注释JavaBean集合属性(如列表)
属性说明:value:@XmlElement注解集合
@XmlAttribute
注解说明:将JavaBean属性映射到XML属性
使用范围:JavaBean属性、字段
对象转XML类:
@XmlRootElement
public class Account {
private String id;
private String name;
private BigDecimal price;
@XmlAttribute
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@XmlAttribute
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlAttribute
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
}
测试类:public class AccountTest {
public static void main(String[] args) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(Account.class);
Marshaller marshaller = jaxbContext.createMarshaller();
// 用来指定是否使用换行和缩排对已编组XML数据进行格式化的属性名称
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Account acc = new Account();
acc.setId("0001");
acc.setName("张三");
acc.setPrice(new BigDecimal(132000.00));
marshaller.marshal(acc, System.out);
}
}
输出结果:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<account price="132000" name="张三" id="0001"/>