JAXB例子

JAXB介紹
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"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章