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