介绍:

Java和xml的互相转换, 依靠强大的JAXBContext能够轻松实现。

JAXBContext是jdk自带的一个工具,包路径:javax.xml.bind.JAXBContext。

关于JAXB:java

JAXB可以使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来能够更好的标志能够转换为JSON对象的JAVA类。JAXB容许JAVA人员将JAVA类映射为XML表示方式,经常使用的注解包括:@XmlRootElement,@XmlElement等等。

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项能够根据XML Schema产生Java类的技术。该过程当中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容从新写到XML实例文档。从另外一方面来说,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。web

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属性。

其余:

对于要序列化(marshal)为XML的Java类,毫不能把成员变量声明为public,不然运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。

对于JAXB相关的重要Annotation的声明,如@Xml…..,能够放在成员变量的setter()或getter()方法上,二者中任选其一便可,但决不能放在成员变量上,不然运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。数组

示例:

类文件注解:@XmlRootElement不可缺乏

Student 实体类ruby

@XmlRootElement

public class Student {

private String name;

private String width;

private String height;

private int age;

public Student(String name, String width, String height, int age) {

super();

this.name = name;

this.width = width;

this.height = height;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getWidth() {

return width;

}

public void setWidth(String width) {

this.width = width;

}

public String getHeight() {

return height;

}

public void setHeight(String height) {

this.height = height;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public Student() {

super();

}

}

JavaToXml:app

@Test

public void test01(){

try {

JAXBContext jc = JAXBContext.newInstance(Student.class);

Marshaller ms = jc.createMarshaller();

Student st = new Student("zhang", "w", "h", 11);

ms.marshal(st, System.out);

} catch (JAXBException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

XmlToJava:svg

@Test

public void test02() throws JAXBException{

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>11hzhangw";

JAXBContext jc = JAXBContext.newInstance(Student.class);

Unmarshaller unmar = jc.createUnmarshaller();

Student stu = (Student) unmar.unmarshal(new StringReader(xml));

System.out.println(stu.getName());

}

其实Marshal 和 UnMarshal的过程并不复杂,只须要从JAXBContext中得到Marshaller或Unmarshaller对象,就可让JAXB帮咱们来进行转换了。咱们须要操做的主要内容是定义一个规则,告诉JAXB如何将一个类、按照什么样的格式转换为XML,下面是JAXB中主要的一些注解。函数

经常使用annotation使用说明

1.@XmlType

@XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一块儿使用。它有三个属性:name、propOrder、namespace,常常使用的只有前两个属性。如:工具

@XmlType(name = "basicStruct", propOrder = {

"intValue",

"stringArray",

"stringValue"

)

在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的全部属性,不然会报错。

参数:

propOrder 指定映射XML时的节点顺序

factoryClass 指定UnMarshal时生成映射类实例所需的工厂类,默认为这个类自己

factoryMethod 指定工厂类的工厂方法

name 定义XML Schema中type的名称

namespace 指定Schema中的命名空间ui

2.@XmlElement

@XmlElement将java对象的属性映射为xml的节点,在使用@XmlElement时,可经过name属性改变java对象属性在xml中显示的名称。如:this

@XmlElement(name="Address")

private String yourAddress;

当一个类的XmlAccessorType 被标注为PROPERTY时,在某一个没有get/set方法的字段上标注此注解,便可将该字段映射到XML。

参数:

defaultValue 指定节点默认值

name 指定节点名称

namespace 指定节点命名空间

required 是否必须(默认为false)

nillable 该字段是否包含 nillable=”true” 属性(默认为false)

type 定义该字段或属性的关联类型

3.@XmlRootElement

@XmlRootElement用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccessorType一块儿使用。如:

@XmlType

@XmlAccessorType(XmlAccessType.FIELD)

@XmlRootElement

public class Address {}

参数:

name 定义这个根节点的名称

namespace 定义这个根节点命名空间

4.@XmlAttribute

@XmlAttribute用于把java对象的属性映射为xml的属性,并可经过name属性为生成的xml属性指定别名。如:

@XmlAttribute(name="Country")

private String state;

参数:

name 指定属性名称

namespace 指定属性命名空间

required 是否必须(默认为false)

5.@XmlAccessorType

@XmlAccessorType用于指定由java对象生成xml文件时对java对象属性的访问方式。常与@XmlRootElement、@XmlType一块儿使用。它的属性值是XmlAccessType的4个枚举值,分   别为:

XmlAccessType.FIELD:java对象中的全部成员变量

XmlAccessType.PROPERTY:java对象中全部经过getter/setter方式访问的成员变量

XmlAccessType.PUBLIC_MEMBER:java对象中全部的public访问权限的成员变量和经过getter/setter方式访问的成员变量

XmlAccessType.NONE:java对象的全部属性都不映射为xml的元素

注意:@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER,所以,若是java对象中的private成员变量设置了public权限的getter/setter方法,就不要在   private变量上使用@XmlElement和@XmlAttribute注解,不然在由java对象生成xml时会报同一个属性在java类里存在两次的错误。同理,若是@XmlAccessorType的访问权限   为XmlAccessType.NONE,若是在java的成员变量上使用了@XmlElement或@XmlAttribute注解,这些成员变量依然能够映射到xml文件。

6.@XmlAccessorOrder

@XmlAccessorOrder用于对java对象生成的xml元素进行排序。它有两个属性值:

AccessorOrder.ALPHABETICAL:对生成的xml元素按字母书序排序

XmlAccessOrder.UNDEFINED:不排序

7.@XmlTransient

@XmlTransient 定义某一字段或属性不须要被映射为XML。如,当一个类的XmlAccessorType 被标注为PROPERTY时,在某一get/set方法的字段上标注此注解,那么该属性则不会被映射。注意:当某一字段或属性添加了@XmlElement,那么该字段或属性的get/set方法必须使用@XmlTransient, 不然将会报异常:1 counts of IllegalAnnotationExceptions

8.@XmlJavaTypeAdapter

@XmlJavaTypeAdapter经常使用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,须要本身写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。

@XmlJavaTypeAdapter(value=xxx.class),value为本身定义的adapter类

XmlAdapter以下:

public abstract class XmlAdapter {

// Do-nothing constructor for the derived classes.

protected XmlAdapter() {}

// Convert a value type to a bound type.

public abstract BoundType unmarshal(ValueType v);

// Convert a bound type to a value type.

public abstract ValueType marshal(BoundType v);

}

9.@XmlElementWrapper

@XmlElementWrapper 为数组元素或集合元素定义一个父节点。如,类中有一元素为List items,若不加此注解,该元素将被映射为

...

...

这种形式,此注解可将这个元素进行包装,如:

@XmlElementWrapper(name="items")

@XmlElement(name="item")

public List items;

将会生成这样的XML样式:

...

...

10.@XmlSchema

@XmlSchema这个注解需放在package-info.java文件中。

jaxb编码:

JAXBContext jaxbContext = JAXBContext.newInstance(clazz);

Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

InputStreamReader reader=new InputStreamReader(inputStream,"GBK"); //在此修改编码

return unmarshaller.unmarshal(reader);