JAXB(一)——初体验之实现XML和对象之间的映射

前端之家收集整理的这篇文章主要介绍了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上的一个属性。默认情况下,当我们的一个属性没有使用XmlElement标注时也会被序列化为Xml元素的一个子元素,如果我们不希望Java对象中的某个属性被序列化则可以在对应的属性或对应的get方法上采用XMLTransient进行标注。

示例

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);

}

原文链接:https://www.f2er.com/xml/295328.html

猜你在找的XML相关文章