赞
踩
一、简介
JAXB(Java API for XML Binding)是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。
Jaxb 2.0是JDK 1.6的组成部分。我们不需要下载第三方jar包即可做到轻松转换。Jaxb2使用了JDK的新特性,如:Annotation、GenericType等,需要在即将转换的JavaBean中添加annotation注解。
二、用法
1、JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
2、Marshaller接口,将Java对象转化为XML数据。
3、Unmarshaller接口,将XML数据转化为Java对象。
注解:
1>@XmlRootElement,用于类上的注解,将一个Java类及其成员变量映射为XML的根节点以及子节点。其中:属性name定义根节点的名称,namespace定义这个根节点命名空间。常与@XmlType和@XmlAccessorType一起使用。
2>@XmlType,用在类上的注解。其中:属性name指定XML Schema中type的名称,namespace指定Schema中的命名空间,factoryClass指定unMarshal时生成映射类实例所需的工厂类,默认为这个类本身,factoryMethod指定工厂类的工厂方法,propOrder指定序列化的顺序:
①所有转为XML元素的属性都必须出现在@XmlType的propOrder列表中;
②所有@XmlElementWrapper标注的属性都不能出现在@XmlType的propOrder列表中。
3>@XmlAccessorType,用于类上的注解,用于指定对象的哪些成员变量会生成xml。常与@XmlRootElement、@XmlType一起使用。其中属性XmlAccessType的4个枚举值,分别为:
①XmlAccessType.FIELD:对象中的所有成员变量
②XmlAccessType.PROPERTY:对象中所有通过getter/setter方式访问的成员变量
③XmlAccessType.PUBLIC_MEMBER:对象中所有有public访问权限的成员变量和通过getter/setter方式访问的成员变量
④XmlAccessType.NONE:对象的所有属性都不映射为xml的元素
注意:@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER,因此,如果对象中的private成员变量设置了getter/setter方法,就不要在private变量上使用@XmlElement和@XmlAttribute注解,否则在由对象生成xml时会报该属性在java类里存在两次的错误。同理,如果@XmlAccessorType的访问权限为XmlAccessType.NONE,如果在成员变量上使用了@XmlElement或@XmlAttribute注解,这些成员变量依然可以映射到xml文件。
4>@XmlAccessorOrder,用于类上的注解,对元素进行排序。它有两个值:
①XmlAccessOrder.ALPHABETICAL:按字母书序排序
②XmlAccessOrder.UNDEFINED:不排序
5>@XmlElement,用于成员变量或getter/setter方法上,将对应的变量映射到同名的一个XML节点。其中:属性name指定节点名称,namespace指定节点命名空间,required指定节点是否必输,nillable指定节点是否是nillable,type指定节点关联的类型。
6>@XmlElementWrapper ,用于成员变量或getter/setter方法上,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素。其中:属性name指定集合名称,namespace指定集合命名空间,required指定集合是否必输,nillable指定集合是否是nillable。
7>@XmlAttribute,用于成员变量或getter/setter方法上,将对应的变量映射到同名的一个XML节点属性。其中:属性name指定属性名称,namespace指定属性命名空间,required指定属性是否必输。
8>@XmlTransient,用于标示在由java对象映射xml时,忽略此属性。即在生成的xml文件中不出现此元素。
9>@XmlSchema,配置整个包的namespace,这个注解需放在package-info.java文件中。
10>@XmlJavaTypeAdapter以及@XmlJavaTypeAdapters,用于包、类、成员变量或getter/setter方法上,常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。使用格式是:@XmlJavaTypeAdapter(value=xxx.class),xxx为自己定义的adapter类。
三、示例
1、对象转为xml
People.java
- @XmlRootElement(name="employee")
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name="emp",namespace="aa",propOrder={"id","name","sex","age"})
- public class People{
- public String id="001";
- public String name="张三";
- public String sex="男";
- private String age="30";
- }
Test.java
- public class Test {
- public static void main(String args[]){
- People p = new People();
- convertToXml(p,"utf-8");
- }
-
- public static String convertToXml(Object obj, String encoding){
- String result = null;
- try {
- JAXBContext context = JAXBContext.newInstance(obj.getClass());
- Marshaller marshaller = context.createMarshaller();
- marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
- marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
- marshaller.setProperty(Marshaller.JAXB_FRAGMENT,false);
-
- StringWriter writer = new StringWriter();
- marshaller.marshal(obj, writer);
- result = writer.toString();
- System.out.println(result);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return result;
- }
- }
2、xml转为对象
People.java
- @XmlRootElement(name="employee")
- public class People{
- public String id;
- public String name;
- public String sex;
- public String age;
-
- public String toString(){
- return this.id+","+this.name+","+this.sex+","+this.age;
- }
- }
Test.java
- public class Test {
- public static void main(String args[]){
- People p = new People();
- String xml="<?xml version='1.0' encoding='utf-8' standalone='yes'?>" +
- "<employee>"+
- "<id>002</id>"+
- "<name>李四</name>"+
- "<sex>女</sex>"+
- "<age>28</age>"+
- "</employee>";
- convertToObject(p, xml);
- }
-
- public static String convertToObject(People p, String xml){
- String result = null;
- try {
- StringReader sr = new StringReader(xml);
- JAXBContext context = JAXBContext.newInstance(p.getClass());
- Unmarshaller unmarshaller = context.createUnmarshaller();
- p=(People)unmarshaller.unmarshal(sr);
- result=p.toString();
- System.out.println(result);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return result;
- }
- }
参考:http://blog.csdn.net/lw371496536/article/details/6942045
http://www.cnblogs.com/qiyebao/p/4573665.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。