一、简介
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
Java SE中的JAXB
JAXB 2.0是JDK 1.6的组成部分。JAXB 2.2.3是JDK 1.7的组成部分。
JDK中JAXB相关的重要Class和Interface:
JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
Marshaller接口,将Java对象序列化为XML数据。
Unmarshaller接口,将XML数据反序列化为Java对象。
JDK中JAXB相关的重要Annotation:
@XmlType,将Java类或枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
@XmlRootElement,将Java类或枚举类型映射到XML元素。
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。
toXml方法是用Marshaller接口将对象转成xml数据
//将java对象Car转成xml数据
1 static void toXml() throws Exception{ 2 JAXBContext jaxbContext = JAXBContext.newInstance(Car.class); 3 Marshaller marshaller = jaxbContext.createMarshaller(); 4 5 Wheel wheel = new Wheel(); 6 FuelSystem fuelSystem = new FuelSystem(); 7 fuelSystem.setName("燃油系统"); 8 Engine engine = new Engine(); 9 engine.setFuelSystem(fuelSystem); 10 Car car = new Car(); 11 car.setWheel(wheel); 12 car.setEngine(engine); 13 14 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 15 //marshaller.marshal(car, System.out); 16 marshaller.marshal(car, new FileOutputStream("src/car.xml")); 17 }
生成的xml文件
1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 2 <car> 3 <wheel> 4 <hub>4</hub> 5 <tire>4</tire> 6 </wheel> 7 <engine> 8 <fuelSystem> 9 <name>燃油系统</name> 10 </fuelSystem> 11 </engine> 12 </car>
1 //xml文件转成对象 2 static void Xml2Obj() throws Exception{ 3 JAXBContext jaxbContext = JAXBContext.newInstance(Car.class); 4 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 5 Car car = (Car) unmarshaller.unmarshal(new File("src/car.xml")); 6 System.out.println(car); 7 }
输出的值为car.toString():
Car [wheel=Wheel [tire=4, hub=4], engine=Engine [fuelSystem=FuelSystem [name=燃油系统]]]
1 package com.chen.jaxb; 2 3 import javax.xml.bind.annotation.XmlAccessType; 4 import javax.xml.bind.annotation.XmlAccessorType; 5 import javax.xml.bind.annotation.XmlRootElement; 6 7 @XmlRootElement 8 @XmlAccessorType(XmlAccessType.FIELD) 9 public class Car { 10 private Wheel wheel; 11 private Engine engine; 12 public Wheel getWheel() { 13 return wheel; 14 } 15 public void setWheel(Wheel wheel) { 16 this.wheel = wheel; 17 } 18 public Engine getEngine() { 19 return engine; 20 } 21 public void setEngine(Engine engine) { 22 this.engine = engine; 23 } 24 @Override 25 public String toString() { 26 return "Car [wheel=" + wheel + ", engine=" + engine + "]"; 27 } 28 }
1 package com.chen.jaxb; 2 3 public class Engine { 4 private FuelSystem fuelSystem; 5 6 public FuelSystem getFuelSystem() { 7 return fuelSystem; 8 } 9 10 public void setFuelSystem(FuelSystem fuelSystem) { 11 this.fuelSystem = fuelSystem; 12 } 13 @Override 14 public String toString() { 15 return "Engine [fuelSystem=" + fuelSystem + "]"; 16 } 17 }
1 package com.chen.jaxb; 2 3 public class FuelSystem { 4 private String name; 5 6 public String getName() { 7 return name; 8 } 9 public void setName(String name) { 10 this.name = name; 11 } 12 @Override 13 public String toString() { 14 return "FuelSystem [name=" + name + "]"; 15 } 16 }
1 package com.chen.jaxb; 2 3 public class Wheel { 4 int tire = 4; //轮胎 5 int hub = 4; //轮毂 6 7 public int getTire() { 8 return tire; 9 } 10 public void setTire(int tire) { 11 this.tire = tire; 12 } 13 public int getHub() { 14 return hub; 15 } 16 public void setHub(int hub) { 17 this.hub = hub; 18 } 19 @Override 20 public String toString() { 21 return "Wheel [tire=" + tire + ", hub=" + hub + "]"; 22 } 23 }