首页 > 其他 > 详细

通过JAXB实现XML和对象之间的映射

时间:2016-04-24 02:03:23      阅读:467      评论:0      收藏:0      [点我收藏+]

通过JAXB实现XML和对象之间的映射

?

???????? JAXB的全称是Java Architecture for XML Binding,是一项可以通过XML产生Java对象,也可以通过Java对象产生XML的技术。JDK中关于JAXB部分有几个比较重要的接口或类,如:

?? JAXBContext:它是程序的入口类,提供了XML/Java绑定的操作,包括marshalunmarshal等。

?? Marshaller:它负责把Java对象序列化为对应的XML

?? Unmarshaller:它负责把XML反序列化为对应的Java对象。

?

序列化

???????? 进行序列化的基本操作步骤如下:

?? //1、获取一个基于某个classJAXBContext,即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、? 最后一步是将对应的对象序列化到一个WriterOutputStreamFile等输出对象中,具体可以参考Marshaller接口的API文档。

?

???????? 使用JAXB进行对象的序列化时对应的对象类型必须是javax.xml.bind.JAXBElement类型,或者是使用了javax.xml.bind.annotation.XmlRootElement注解标注的类型。XmlRootElement用于标注在class上面,表示把一个class映射为一个XML Element对象。与之相配合使用的注解通常还有XmlElementXmlAttributeXmlElement注解用于标注在class的属性上,用于把一个class的属性映射为一个XML Element对象。XmlAttribute注解用于标注在class的属性上,用于把一个class的属性映射为其class对应的XML Element上的一个属性。

?

示例

Person

@XmlRootElement

publicclass Person {

?

?? private Integer id;

?? private String name;

?? private Integer age;

?? private Address address;

?

?? @XmlAttribute(name = "id")

?? public Integer getId() {

????? returnid;

?? }

?

?? publicvoid setId(Integer id) {

????? this.id = id;

?? }

?

?? @XmlAttribute

?? public String getName() {

????? returnname;

?? }

?

?? publicvoid setName(String name) {

????? this.name = name;

?? }

?

?? @XmlElement

?? public Integer getAge() {

????? returnage;

?? }

?

?? publicvoid setAge(Integer age) {

????? this.age = age;

?? }

?

?? @XmlElement

?? public Address getAddress() {

????? returnaddress;

?? }

?

?? publicvoid setAddress(Address address) {

????? this.address = address;

?? }

?

}

?

Address

?

@XmlRootElement

publicclass Address {

?

?? private Integer id;

?? private String province;

?? private String city;

?? private String area;

?? private String other;

?

?? @XmlAttribute(name="id")

?? public Integer getId() {

????? returnid;

?? }

?

?? publicvoid setId(Integer id) {

????? this.id = id;

?? }

?

?? @XmlElement

?? public String getProvince() {

????? returnprovince;

?? }

?

?? publicvoid setProvince(String province) {

????? this.province = province;

?? }

?

?? @XmlElement

?? public String getCity() {

????? returncity;

?? }

?

?? publicvoid setCity(String city) {

????? this.city = city;

?? }

?

?? @XmlElement

?? public String getArea() {

????? returnarea;

?? }

?

?? publicvoid setArea(String area) {

????? this.area = area;

?? }

?

?? @XmlElement

?? public String getOther() {

????? returnother;

?? }

?

?? publicvoid setOther(String other) {

????? this.other = other;

?? }

?

}

?

测试方法

?? @Test

?? publicvoid 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、创建一个指定classJAXB上下文对象

?? JAXBContext context = JAXBContext.newInstance(Person.class);

?? //2、通过JAXBContext对象创建对应的Unmarshaller对象。

?? Unmarshaller unmarshaller = context.createUnmarshaller();

?? File file = new File("D:\\person.xml");

?? //3、调用Unmarshaller对象的unmarshal方法进行反序列化,接收的参数可以是一个InputStreamReaderFile

?? Person person = (Person) unmarshaller.unmarshal(file);

?

???????? Unmarshaller对象在提供了一系列的unmarshal重载方法,对应的参数类型可以是FileInputStreamReader等,具体的可以查看对应的API文档。

?

JAXB工具类

???????? 除了使用JAXBContext来创建MarshallerUnmarshaller对象来实现Java对象和XML之间的互转外,Java还为我们提供了一个工具类JAXBJAXB工具类提供了一系列的静态方法来简化了Java对象和XML之间的互转,只需要简单的一行代码即可搞定。

?

?? @Test

?? publicvoid 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

?? publicvoid testUnmarshal1() {

????? File xml = new File("D:\\person.xml");

????? Person person = JAXB.unmarshal(xml, Person.class);

????? System.out.println(person);

?? }

?

?

通过JAXB实现XML和对象之间的映射

原文:http://haohaoxuexi.iteye.com/blog/2292429

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!