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"/>