溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

通過(guò)JAXB實(shí)現(xiàn)XML和對(duì)象之間映射的方法

發(fā)布時(shí)間:2020-10-24 17:00:11 來(lái)源:億速云 閱讀:169 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)通過(guò)JAXB實(shí)現(xiàn)XML和對(duì)象之間映射的方法的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

JAXB的全稱是Java Architecture for XML Binding,是一項(xiàng)可以通過(guò)XML產(chǎn)生Java對(duì)象,也可以通過(guò)Java對(duì)象產(chǎn)生XML的技術(shù)。JDK中關(guān)于JAXB部分有幾個(gè)比較重要的接口或類,如:

?  JAXBContext:它是程序的入口類,提供了XML/Java綁定的操作,包括marshal、unmarshal等。

?  Marshaller:它負(fù)責(zé)把Java對(duì)象序列化為對(duì)應(yīng)的XML。

?  Unmarshaller:它負(fù)責(zé)把XML反序列化為對(duì)應(yīng)的Java對(duì)象。

序列化

進(jìn)行序列化的基本操作步驟如下:

  //1、獲取一個(gè)基于某個(gè)class的JAXBContext,即JAXB上下文
   JAXBContext jaxbContext = JAXBContext.newInstance(obj.getClass());
   //2、利用JAXBContext對(duì)象創(chuàng)建對(duì)象的Marshaller實(shí)例。
   Marshaller marshaller = jaxbContext.createMarshaller();
   //3、設(shè)置一些序列化時(shí)需要的指定的配置
   marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
    StringWriter writer = new StringWriter();
    //4、將對(duì)象進(jìn)行序列化
    marshaller.marshal(obj, writer);

1、  創(chuàng)建一個(gè)JAXB上下文對(duì)象。

2、  利用JAXB上下文對(duì)象創(chuàng)建對(duì)應(yīng)的Marshaller對(duì)象。

3、  指定序列化時(shí)的配置參數(shù),具體可以設(shè)置的參數(shù)和對(duì)應(yīng)的參數(shù)的含義可以參考API文檔。

4、  最后一步是將對(duì)應(yīng)的對(duì)象序列化到一個(gè)Writer、OutputStream、File等輸出對(duì)象中,具體可以參考Marshaller接口的API文檔。

使用JAXB進(jìn)行對(duì)象的序列化時(shí)對(duì)應(yīng)的對(duì)象類型必須是javax.xml.bind.JAXBElement類型,或者是使用了javax.xml.bind.annotation.XmlRootElement注解標(biāo)注的類型。XmlRootElement用于標(biāo)注在class上面,表示把一個(gè)class映射為一個(gè)XML Element對(duì)象。與之相配合使用的注解通常還有XmlElement和XmlAttribute。XmlElement注解用于標(biāo)注在class的屬性上,用于把一個(gè)class的屬性映射為一個(gè)XML Element對(duì)象。XmlAttribute注解用于標(biāo)注在class的屬性上,用于把一個(gè)class的屬性映射為其class對(duì)應(yīng)的XML Element上的一個(gè)屬性。默認(rèn)情況下,當(dāng)我們的一個(gè)屬性沒有使用XmlElement標(biāo)注時(shí)也會(huì)被序列化為Xml元素的一個(gè)子元素,如果我們不希望Java對(duì)象中的某個(gè)屬性被序列化則可以在對(duì)應(yīng)的屬性或?qū)?yīng)的get方法上采用XMLTransient進(jìn)行標(biāo)注。

示例

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

測(cè)試方法

 @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("南山區(qū)");
      address.setOther("其它");
      person.setAddress(address);
     
      marshaller.marshal(person, writer);
      System.out.println(writer.toString());
   }

輸出結(jié)果

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person id="1" name="張三">
    <address id="1">
        <area>南山區(qū)</area>
        <city>深圳市</city>
        <other>其它</other>
        <province>廣東省</province>
    </address>
    <age>30</age>
</person>

反序列化

進(jìn)行反序列化的基本步驟如下:

//1、創(chuàng)建一個(gè)指定class的JAXB上下文對(duì)象
   JAXBContext context = JAXBContext.newInstance(Person.class);
   //2、通過(guò)JAXBContext對(duì)象創(chuàng)建對(duì)應(yīng)的Unmarshaller對(duì)象。
   Unmarshaller unmarshaller = context.createUnmarshaller();
   File file = new File("D:\\person.xml");
   //3、調(diào)用Unmarshaller對(duì)象的unmarshal方法進(jìn)行反序列化,接收的參數(shù)可以是一個(gè)InputStream、Reader、File等
   Person person = (Person) unmarshaller.unmarshal(file);

Unmarshaller對(duì)象在提供了一系列的unmarshal重載方法,對(duì)應(yīng)的參數(shù)類型可以是File、InputStream、Reader等,具體的可以查看對(duì)應(yīng)的API文檔。

JAXB工具類

除了使用JAXBContext來(lái)創(chuàng)建Marshaller和Unmarshaller對(duì)象來(lái)實(shí)現(xiàn)Java對(duì)象和XML之間的互轉(zhuǎn)外,Java還為我們提供了一個(gè)工具類JAXB。JAXB工具類提供了一系列的靜態(tài)方法來(lái)簡(jiǎn)化了Java對(duì)象和XML之間的互轉(zhuǎn),只需要簡(jiǎn)單的一行代碼即可搞定。

 @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("南山區(qū)");
      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);
   }

感謝各位的閱讀!關(guān)于通過(guò)JAXB實(shí)現(xiàn)XML和對(duì)象之間映射的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI