JAXB实现JavaBean和xml互相转换

33 篇文章 0 订阅
7 篇文章 0 订阅

一、简介

        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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值