首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

JAXB初始了解

2012-11-17 
JAXB初步了解JAXB 的全名是Java Architecture for XML Binding。JAXB的特点就是将你用DTD定义好的XML文档映

JAXB初步了解

JAXB 的全名是Java Architecture for XML Binding。JAXB的特点就是将你用DTD定义好的XML文档映射为Java对象,提供简单、快速的数据操作方式。要访问XML中的元素、属性只要通过相应对象上的一系列getter和?setter方法。你还可以通过marshal方法将对象的数据写进XML文件,通过unmarshal方法将XML文件的数据读入对象,通过validate方法验证XML文件是否符合DTD的约束。JAXB的缺点就在于只能访问特定的(也就是你用DTD定义的)XML文档。

先看例子吧:

?

Customer.java

?

import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement; @XmlRootElementpublic class Customer {    String name;    int age;    int id;        @XmlElement       public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }        @XmlElement    public int getAge() {        return age;    }     public void setAge(int age) {        this.age = age;    }         @XmlAttribute    public int getId() {        return id;    }      public void setId(int id) {        this.id = id;    }    @Override    public String toString()    {   return "Customer[" + getName() + "," + getId() + "," + getAge() + "]";       }}

?

?

?

import java.io.File;import javax.xml.bind.JAXBContext;import javax.xml.bind.Unmarshaller;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;public class JAXBExample {    public static void main(String[] args) {      Customer customer = new Customer();      customer.setId(100);      customer.setName("mkyong");      customer.setAge(29);       try {        File file = new File("C:\\file.xml");        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);                //JAVA to XML        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();        //按标签划分行        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);        jaxbMarshaller.marshal(customer, file);        jaxbMarshaller.marshal(customer, System.out);   //打印输出                  //XML TO JAVA        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();    Customer mycustomer = (Customer) jaxbUnmarshaller.unmarshal(file);    System.out.println(mycustomer);          } catch (JAXBException e) {        e.printStackTrace();          }      }}

?

?控制台打印输出如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<customer id="100">

? ? <age>29</age>

? ? <name>mkyong</name>

</customer>

Customer[mkyong,100,29]

?

关于注解:

@XmlRootElement?? 将一个Java类映射为一段XML的根节点
参数:name??????????? 定义这个根节点的名称
? ? ? ? ?namespace?? 定义这个根节点命名空间


@XmlAccessorType??定义映射这个类中的何种类型需要映射到XML。可接收四个参数,分别是:
? ? ? XmlAccessType.FIELD:映射这个类中的所有字段到XML
????? XmlAccessType.PROPERTY:映射这个类中的属性(get/set方法)到XML
????? XmlAccessType.PUBLIC_MEMBER:将这个类中的所有public的field或property同时映射到XML(默认)
????? XmlAccessType.NONE:不映射

@XmlElement? 指定一个字段或get/set方法映射到XML的节点。如,当一个类的XmlAccessorType 被标注为PROPERTY时,在某一个没有get/set方法的字段上标注此注解,即可将该字段映射到XML。
参数:defaultValue? 指定节点默认值
???????? name???????????? 指定节点名称
???????? namespace??? 指定节点命名空间
???????? required???????? 是否必须(默认为false)
???????? nillable?????????? 该字段是否包含 nillable="true" 属性(默认为false)
? ? ? ? type?????????????? 定义该字段或属性的关联类型

@XmlAttribute? 指定一个字段或get/set方法映射到XML的属性。
参数:name???????????? 指定属性名称
???????? namespace??? 指定属性命名空间
???????? required???????? 是否必须(默认为false)

@XmlTransient??定义某一字段或属性不需要被映射为XML。如,当一个类的XmlAccessorType 被标注为PROPERTY时,在某一get/set方法的字段上标注此注解,那么该属性则不会被映射。

@XmlType?定义映射的一些相关规则
参数:propOrder??????? 指定映射XML时的节点顺序
???????? factoryClass???? 指定UnMarshal时生成映射类实例所需的工厂类,默认为这个类本身
???????? factoryMethod? 指定工厂类的工厂方法
???????? name?????????????? 定义XML Schema中type的名称
???????? namespace????? 指定Schema中的命名空间

@XmlElementWrapper? 为数组元素或集合元素定义一个父节点。如,类中有一元素为List items,若不加此注解,该元素将被映射为
? ? <items>...</items>
??? <items>...</items>
这种形式,此注解可将这个元素进行包装,如:

??? @XmlElementWrapper(name="items")
??? @XmlElement(name="item")
??? public List items;
将会生成这样的XML样式:
??? <items>
? ? ? ?<item>...</item>
? ? ? ?<item>...</item>
??? </items>

@XmlJavaTypeAdapter? 自定义某一字段或属性映射到XML的适配器。如,类中包含一个接口,我们可以定义一个适配器(继承自 javax.xml.bind.annotation.adapters.XmlAdapter类),指定这个接口如何映射到XML。

@XmlSchema?配置整个包的namespace,这个注解需放在package-info.java文件中。

?

?

测试:

将上面的代码做少许更改,如下:

?

    @XmlElement(name = "myname")       public String getName() {        return name;    }    @XmlAttribute(name = "theID")    public int getId() {        return id;    }  

?结果打印输出为:

?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<customer theID="100">

? ? <age>29</age>

? ? <myname>mkyong</myname>

</customer>

Customer[mkyong,100,29]

发现改变了属性及节点的标签名称。

?

总结:

注解可以放在成员变量声明上面,也可以放在set/get函数上面。若是要指定别名的时候,不能放在变量声明上面,会报错。

?

参考:jaxb注解

?

热点排行