主要引至http://suo.iteye.com/blog/1233458

一、簡介

1、概念是什么:(Java Architecture for XML Binding) 是一個業界的標準,是一項可以根據XML Schema產生Java類的技術。是一種xml與object映射綁定技術標準,既然是標準就可以有不同實現.
2、JAXB中有什么:包含“xjc”工具和一個“schemagen”工具。
“xjc”工具可以用來將XML模式或其他類型模式文件(Java 1.6試驗性地支持RELAX NG,DTD以及WSDL)轉換為Java類。Java類使用javax.xml.bind.annotation包下的Java 標注,例如@XmlRootElement和@XmlElement。XML列表序列表示為java.util.List類型的屬性, 通過JAXBContext可以創建Marshallers(將Java對象轉換成XML)和Unmarshallers(將XML解析為Java對象)。 另外的“schemagen”工具,能夠執行“xjc”的反向操作,通過一組標注的Java類創建一個XML模式。

二、JDK5以下開發需要的jar包:activation.jar、jaxb-api.jar、 jaxb-impl.jar、 jsr173-api.jar; 如果是基于JDK6以上版本已經集成JAXB2的JAR,在目錄{JDK_HOME}/jre/lib/rt.jar中。

三、標注相關
注意:

1、注解可在屬性定義上,也可在getter()方法上,最好在方法上注解,修飾屬性用private,方法是public,屬性注解可能會出現問題(如:JAXB “Class has two properties of the same name”)。

2、對象中的屬性可以不全部映射到xml中,xml中出現的元素也不一定與映射的實體一一對應,映射的雙方可以靈活對應

3、類上注解后,類中元素也默認按默認名稱映射,但是對象屬性名稱與xml節點元素名稱不一致時或者不需要顯示在xml節點中時,則必須做對應的映射配置。

4、注解實例:映射一般分分:類名與xml根節點的映射、普通屬性與xml節點的映射、集合與xml中包含子元素的節點的映射。


示例代碼:
step1:

Customer.java
 1package step1;
 2import javax.xml.bind.annotation.XmlAttribute;
 3import javax.xml.bind.annotation.XmlElement;
 4import javax.xml.bind.annotation.XmlRootElement;
 5
 6/*@XmlRootElement 注釋可以與以下程序元素一起使用: 
 7頂層類 
 8枚舉類型 
 9當使用 @XmlRootElement 注釋對頂層類或枚舉類型進行注釋時,
10類型值被表示為 XML 文檔中的 XML 元素。
11*/

12@XmlRootElement
13public class Customer {
14    String name;
15    int age;
16    int id;
17
18    @XmlElement  //該注釋用于將JavaBean 屬性映射到派生于屬性名稱的 XML 元素
19    public String getName() {
20        return name;
21    }

22    public void setName(String name) {
23        this.name = name;
24    }

25    
26    @XmlElement
27    public int getAge() {
28        return age;
29    }

30    public void setAge(int age) {
31        this.age = age;
32    }

33    
34    @XmlAttribute  //將JavaBean 屬性映射到 XML 屬性。
35    public int getId() {
36        return id;
37    }

38    public void setId(int id) {
39        this.id = id;
40    }

41    
42    @Override
43    public String toString() {
44        return "Customer [id=" + id + ",name=" + name + ",age=" + age + "]";
45    }

46
47    
48    
49}

50

Object2XmlDemo.java
 1package step1;
 2
 3import java.io.File;
 4import javax.xml.bind.JAXBContext;
 5import javax.xml.bind.JAXBException;
 6import javax.xml.bind.Marshaller;
 7
 8/**
 9 *編組 Marshal(java 2 xml)
10 */

11public class Object2XmlDemo {
12    public static void main(String[] args) {
13
14        Customer customer = new Customer();
15        customer.setId(100);
16        customer.setName("mkyong");
17        customer.setAge(29);
18        try {
19            File file = new File("H:\\file3.xml");
20            //獲得JAXBContext類的新實例
21            JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class); 
22            //創建一個可以用來將 java 內容樹轉換為 XML 數據的 Marshaller 對象。
23            //(Marshaller 類負責管理將 Java 內容樹序列化回 XML 數據的過程)
24            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
25            // output pretty printed
26            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); //設置XML自動換行
27            jaxbMarshaller.marshal(customer, file);//將以customer為根的內容樹 編組到輸出流中
28            jaxbMarshaller.marshal(customer, System.out);
29        }
  catch (JAXBException e) {
30            e.printStackTrace();
31        }

32    }

33}

34
執行后生成對應的xml文件
后臺打印
1<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2<customer id="100">
3    <age>29</age>
4    <name>mkyong</name>
5</customer>
6

Xml2ObjectDemo.java

1package step1;
2
3import java.io.File;
4import javax.xml.bind.JAXBContext;
5import javax.xml.bind.JAXBException;
6import javax.xml.bind.Unmarshaller;
7
8/**
9 *解組 Unmarshaller(xml 2 java)
10 */

11public class Xml2ObjectDemo {
12 public static void main(String[] args) {
13 try {
14 File file = new File("H:\\file.xml");
15 JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
16 //創建一個可以用來將 XML 數據轉換為 java 內容樹的 Unmarshaller 對象。
17 Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
18 //從指定的文件解組 XML 數據并返回得到的內容樹。
19 Customer customer = (Customer) jaxbUnmarshaller.unmarshal(file);
20 System.out.println(customer);
21 }
catch (JAXBException e) {
22 e.printStackTrace();
23 }

24 }

25}

26

執行后,打印
Customer [id=100,name=mkyong,age=29]

其他應用可結合API及其他范例學習.