234390216 阅读(118) 评论(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);

   }