jaxb的全称是java architecture for xml binding,是一项可以通过xml产生java对象,也可以通过java对象产生xml的技术。jdk中关于jaxb部分有几个比较重要的接口或类,如:
ø jaxbcontext:它是程序的入口类,提供了xml/java绑定的操作,包括marshal、unmarshal等。
ø marshaller:它负责把java对象序列化为对应的xml。
ø unmarshaller:它负责把xml反序列化为对应的java对象。
序列化
进行序列化的基本操作步骤如下:
//1、获取一个基于某个class的jaxbcontext,即jaxb上下文
jaxbcontext jaxbcontext = jaxbcontext.newinstance(obj.getclass());
//2、利用jaxbcontext对象创建对象的marshaller实例。
marshaller marshaller = jaxbcontext.createmarshaller();
//3、设置一些序列化时需要的指定的配置
marshaller.setproperty(marshaller.jaxb_formatted_output, boolean.true);
marshaller.setproperty(marshaller.jaxb_fragment, boolean.true);
stringwriter writer = new stringwriter();
//4、将对象进行序列化
marshaller.marshal(obj, writer);
1、 创建一个jaxb上下文对象。
2、 利用jaxb上下文对象创建对应的marshaller对象。
3、 指定序列化时的配置参数,具体可以设置的参数和对应的参数的含义可以参考api文档。
4、 最后一步是将对应的对象序列化到一个writer、outputstream、file等输出对象中,具体可以参考marshaller接口的api文档。
使用jaxb进行对象的序列化时对应的对象类型必须是javax.xml.bind.jaxbelement类型,或者是使用了javax.xml.bind.annotation.xmlrootelement注解标注的类型。xmlrootelement用于标注在class上面,表示把一个class映射为一个xml element对象。与之相配合使用的注解通常还有xmlelement和xmlattribute。xmlelement注解用于标注在class的属性上,用于把一个class的属性映射为一个xml element对象。xmlattribute注解用于标注在class的属性上,用于把一个class的属性映射为其class对应的xml element上的一个属性。默认情况下,当我们的一个属性没有使用xmlelement标注时也会被序列化为xml元素的一个子元素,如果我们不希望java对象中的某个属性被序列化则可以在对应的属性或对应的get方法上采用xmltransient进行标注。
示例
person类
@xmlrootelement
public class person {
private integer id;
private string name;
private integer age;
private address address;
@xmlattribute(name = "id")
public integer getid() {
returnid;
}
public void setid(integer id) {
this.id = id;
}
@xmlattribute
public string getname() {
returnname;
}
public void setname(string name) {
this.name = name;
}
@xmlelement
public integer getage() {
returnage;
}
public void setage(integer age) {
this.age = age;
}
@xmlelement
public address getaddress() {
returnaddress;
}
public void setaddress(address address) {
this.address = address;
}
}
address类
@xmlrootelement
public class address {
private integer id;
private string province;
private string city;
private string area;
private string other;
@xmlattribute(name="id")
public integer getid() {
returnid;
}
public void setid(integer id) {
this.id = id;
}
@xmlelement
public string getprovince() {
returnprovince;
}
public void setprovince(string province) {
this.province = province;
}
@xmlelement
public string getcity() {
returncity;
}
public void setcity(string city) {
this.city = city;
}
@xmlelement
public string getarea() {
returnarea;
}
public void setarea(string area) {
this.area = area;
}
@xmlelement
public string getother() {
returnother;
}
public void setother(string other) {
this.other = other;
}
}
测试方法
@test
public void testmarshal() throws jaxbexception {
jaxbcontext context = jaxbcontext.newinstance(person.class);
marshaller marshaller = context.createmarshaller();
marshaller.setproperty(marshaller.jaxb_formatted_output, true);
stringwriter writer = new stringwriter();
person person = new person();
person.setid(1);
person.setname("张三");
person.setage(30);
address address = new address();
address.setid(1);
address.setprovince("广东省");
address.setcity("深圳市");
address.setarea("南山区");
address.setother("其它");
person.setaddress(address);
marshaller.marshal(person, writer);
system.out.println(writer.tostring());
}
输出结果
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<person id="1" name="张三">
<address id="1">
<area>南山区</area>
<city>深圳市</city>
<other>其它</other>
<province>广东省</province>
</address>
<age>30</age>
</person>
反序列化
进行反序列化的基本步骤如下:
//1、创建一个指定class的jaxb上下文对象
jaxbcontext context = jaxbcontext.newinstance(person.class);
//2、通过jaxbcontext对象创建对应的unmarshaller对象。
unmarshaller unmarshaller = context.createunmarshaller();
file file = new file("d:\\person.xml");
//3、调用unmarshaller对象的unmarshal方法进行反序列化,接收的参数可以是一个inputstream、reader、file等
person person = (person) unmarshaller.unmarshal(file);
unmarshaller对象在提供了一系列的unmarshal重载方法,对应的参数类型可以是file、inputstream、reader等,具体的可以查看对应的api文档。
jaxb工具类
除了使用jaxbcontext来创建marshaller和unmarshaller对象来实现java对象和xml之间的互转外,java还为我们提供了一个工具类jaxb。jaxb工具类提供了一系列的静态方法来简化了java对象和xml之间的互转,只需要简单的一行代码即可搞定。
@test
public void testmarshal1() {
person person = new person();
person.setid(1);
person.setname("张三");
person.setage(30);
address address = new address();
address.setid(1);
address.setprovince("广东省");
address.setcity("深圳市");
address.setarea("南山区");
address.setother("其它");
person.setaddress(address);
jaxb.marshal(person, system.out);
}
@test
public void testunmarshal1() {
file xml = new file("d:\\person.xml");
person person = jaxb.unmarshal(xml, person.class);
system.out.println(person);
}
以上就是详细介绍通过jaxb实现xml和对象之间的映射的详细内容。