pojo对象
1 packagetest.hd.pojo;2
3
4 importjavax.xml.bind.annotation.XmlAccessType;5 importjavax.xml.bind.annotation.XmlAccessorType;6 importjavax.xml.bind.annotation.XmlRootElement;7 importjavax.xml.bind.annotation.XmlType;8
9
10 @XmlRootElement11 @XmlAccessorType(XmlAccessType.FIELD)12 //控制JAXB 绑定类中属性和字段的排序
13 @XmlType(propOrder ={14 "age",15 "name"
16 })17 public classPerson {18
19 privateString name;20
21 privateInteger age;22
23 publicString getName() {24 returnname;25 }26
27 public voidsetName(String name) {28 this.name =name;29 }30
31 publicInteger getAge() {32 returnage;33 }34
35 public voidsetAge(Integer age) {36 this.age =age;37 }38
39 }
测试类
1 packagetest.hd.test_jaxb;2
3 importjava.io.IOException;4 importjava.io.StringReader;5 importjava.io.Writer;6
7 importjavax.xml.bind.JAXBContext;8 importjavax.xml.bind.JAXBException;9 importjavax.xml.bind.Marshaller;10 importjavax.xml.bind.Unmarshaller;11
12 importcom.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;13
14 importtest.hd.pojo.Person;15
16 public classTest {17
18 public static void main(String[] args) throwsJAXBException {19
20 marshall();//对象转xml
21 unMarshal();//xml转对象
22 }23
24 /**
25 * 对象转xml26 *27 *@throwsJAXBException28 */
29 public static void marshall() throwsJAXBException {30 Person person = newPerson();31 person.setName("H__D");32 person.setAge(11);33
34 JAXBContext context = JAXBContext.newInstance(Person.class);35 Marshaller marshaller =context.createMarshaller();36 marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");37 //xml格式
38 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);39 //去掉生成xml的默认报文头40 //marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);41 //不进行转义字符的处理
42 marshaller.setProperty(CharacterEscapeHandler.class.getName(), newCharacterEscapeHandler() {43 public void escape(char[] ch, int start, int length, boolean isAttVal, Writer writer) throwsIOException {44 writer.write(ch, start, length);45 }46 });47 //将XML打印到控制台
48 marshaller.marshal(person, System.out);49
50 }51
52 /**
53 * xml转对象54 *55 *@throwsJAXBException56 */
57 public static void unMarshal() throwsJAXBException {58
59 JAXBContext context = JAXBContext.newInstance(Person.class);60 Unmarshaller unmarshaller =context.createUnmarshaller();61
62 Person p = (Person) unmarshaller.unmarshal(new StringReader("11"));63
64 System.out.println("person = " + p.getName() + "------" +p.getAge());65 }66
67 }
控制台输出
JABX注解使用
@XmlType 定义映射的一些相关规则
参数:
propOrder 指定映射XML时的节点顺序
factoryClass 指定UnMarshal时生成映射类实例所需的工厂类,默认为这个类本身
factoryMethod 指定工厂类的工厂方法
name 定义XML Schema中type的名称
namespace 指定Schema中的命名空间
@XmlAccessorType 定义映射这个类中的何种类型需要映射到XML。可接收四个参数,分别是:
XmlAccessType.FIELD:映射这个类中的所有字段到XML
XmlAccessType.PROPERTY:映射这个类中的属性(get/set方法)到XML
XmlAccessType.PUBLIC_MEMBER:将这个类中的所有public的field或property同时映射到XML(默认)
XmlAccessType.NONE:不映射
@XmlAccessorOrder用于对java对象生成的xml元素进行排序。它有两个属性值:
XmlAccessorOrder.ALPHABETICAL:对生成的xml元素按字母顺序排序;
XmlAccessorOrder.UNDEFINED:不排序。
@XmlJavaTypeAdapter常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。@XmlJavaTypeAdapter(value=xxx.class),value为自己定义的adapter类
XmlAdapter如下:
@XmlElementWrapper注解表示生成一个包装 XML 表示形式的包装器元素。 此元素主要用于生成一个包装集合的包装器 XML 元素。
例如需要输出CDATA格式的数据时,编写一个CDataAdapter类,然后使用XmlJavaTypeAdapter注解:
1 packagetest.hd.util;2
3 importjavax.xml.bind.annotation.adapters.XmlAdapter;4
5 /**
6 * 有时候 Java 类不能自然映射到自己所需的 XML 形式,7 * 这时需要编写自己的适配器类,通过注解绑定到javabean的成员变量上,8 * 在运行的时候jaxb框架自动会适配你所编写的适配器类的方法,9 * CDataAdapter.marshal(String str),将javabean的成员变量的value值10 * 转变成你想要的形式。11 *@authorH__D12 * @date 2017年6月19日 下午4:32:0013 *14 */
15 public class CDataAdapter extends XmlAdapter{16
17 //从javabean到xml的适配方法
18 @Override19 public String marshal(String str) throwsException {20 return "";21 }22
23 //从xml到javabean的适配方法
24 @Override25 public String unmarshal(String str) throwsException {26 returnstr;27 }28
29 }
1 packagetest.hd.pojo;2
3 importjava.io.Serializable;4
5 importjavax.xml.bind.annotation.XmlAccessOrder;6 importjavax.xml.bind.annotation.XmlAccessType;7 importjavax.xml.bind.annotation.XmlAccessorOrder;8 importjavax.xml.bind.annotation.XmlAccessorType;9 importjavax.xml.bind.annotation.XmlRootElement;10 importjavax.xml.bind.annotation.XmlType;11 importjavax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;12
13 importtest.hd.util.CDataAdapter;14
15 @XmlRootElement16 @XmlAccessorType(XmlAccessType.FIELD)17 //控制JAXB 绑定类中属性和字段的排序
18 @XmlType(propOrder ={19 "age",20 "name"
21 })22 @XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)23 public classPerson {24
25 @XmlJavaTypeAdapter(CDataAdapter.class)26 privateString name;27
28 privateInteger age;29
30 publicString getName() {31 returnname;32 }33
34 public voidsetName(String name) {35 this.name =name;36 }37
38 publicInteger getAge() {39 returnage;40 }41
42 public voidsetAge(Integer age) {43 this.age =age;44 }45
46
47
48 }
输出如下
@XmlElementWrapper 为数组元素或集合元素定义一个父节点。如,类中有一元素为List items,若不加此注解,该元素将被映射为
...
...
这种形式,此注解可将这个元素进行包装,如:
@XmlElementWrapper(name="items")
@XmlElement(name="item")
public List items;
将会生成这样的XML样式:
...
...
@XmlRootElement 将一个Java类映射为一段XML的根节点
参数:
name 定义这个根节点的名称
namespace 定义这个根节点命名空间
@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)