1. 程式人生 > >jaxb的介紹,以及對jaxb的入門

jaxb的介紹,以及對jaxb的入門

介紹順序按照:

1. JAXB的介紹

2. JAXB中的核心類以及相關類介紹   

3. JAXB中的常用註解介紹

4. 使用演示展示

首先介紹下什麼是JAXB?

JAXB(Java Architecture for XML Binding) 是一項可以根據XML Schema產生Java類的技術。 該過程中,JAXB也提供了將XML例項文件反向生成Java物件樹的方法,並能將Java物件樹的內容重新寫到 XML例項文件。Jaxb 2.0是JDK 1.6的組成部分。我們不需要下載第三方jar包 即可做到輕鬆轉換。

JAXB的核心類有如下三個:

       JAXBContext類,是應用的入口,用於管理XML/Java繫結資訊。

                   該類不能直接建立,只能使用如下方式進行例項化JAXBContext物件:

(Class... classesToBeBound)
           Obtain a new instance of a JAXBContext class.
(Class[] classesToBeBound, Map<String,?> properties)
           Obtain a new instance of a JAXBContext class.

           Obtain a new instance of a JAXBContext
class.

           Obtain a new instance of a JAXBContext class.

           Obtain a new instance of a JAXBContext class.

       Marshaller介面,將Java物件序列化為XML資料。

                  該類是設定轉換為XML資料的熟悉如格式化輸出xml,裝置xml的編碼格式等:

                  Marshaller marshaller = context.createMarshaller();  
                  marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);  
                  marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);  
                  marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);

       Unmarshaller介面,將XML資料反序列化為Java物件。

                  反序列化java物件需要用到的例項:

                  Unmarshaller unmarshaller = context.createUnmarshaller();  
                   t = (T) unmarshaller.unmarshal(new StringReader(xml));

使用JAXB常用的註解如下:

  • @XmlType,將Java類或列舉型別對映到XML模式型別
  • @XmlAccessorType(XmlAccessType.FIELD) ,控制欄位或屬性的序列化。FIELD表示JAXB將自動繫結Java類中的每個非靜態的(static)、非瞬態的(由@XmlTransient標 注)欄位到XML。其他值還有XmlAccessType.PROPERTY和XmlAccessType.NONE。
  • @XmlAccessorOrder,控制JAXB 繫結類中屬性和欄位的排序。
  • @XmlJavaTypeAdapter,使用定製的介面卡(即擴充套件抽象類XmlAdapter並覆蓋marshal()和unmarshal()方法),以序列化Java類為XML。
  • @XmlElementWrapper ,對於陣列或集合(即包含多個元素的成員變數),生成一個包裝該陣列或集合的XML元素(稱為包裝器)。
  • @XmlRootElement,將Java類或列舉型別對映到XML元素。
  • @XmlElement,將Java類的一個屬性對映到與屬性同名的一個XML元素。
  • @XmlAttribute,將Java類的一個屬性對映到與屬性同名的一個XML屬性。

 [email protected]

  @XmlType用在class類的註解,常與@XmlRootElement,@XmlAccessorType一起使用。它有三個屬性:name、propOrder、namespace,經常使用的只有前兩個屬性。如:

@XmlType(name = "basicStruct", propOrder = {
    "intValue",
    "stringArray",
    "stringValue"
)
在使用@XmlType的propOrder 屬性時,必須列出JavaBean物件中的所有屬性,否則會報錯。

 [email protected]

  @XmlElement將java物件的屬性對映為xml的節點,在使用@XmlElement時,可通過name屬性改變java物件屬性在xml中顯示的名稱。如:

  @XmlElement(name="Address")   private String yourAddress;

 [email protected]

  @XmlRootElement用於類級別的註解,對應xml的跟元素,常與 @XmlType 和 @XmlAccessorType一起使用。如:

@XmlType
  @XmlAccessorType(XmlAccessType.FIELD)
  @XmlRootElement
  public class Address {}

 [email protected]

  @XmlAttribute用於把java物件的屬性對映為xml的屬性,並可通過name屬性為生成的xml屬性指定別名。如: @XmlAttribute(name="Country")
  private String state;

 [email protected]

  @XmlAccessorType用於指定由java物件生成xml檔案時對java物件屬性的訪問方式。常與@XmlRootElement、@XmlType一起使用。它的屬性值是XmlAccessType的4個列舉值,分   別為:

  XmlAccessType.FIELD:java物件中的所有成員變數

  XmlAccessType.PROPERTY:java物件中所有通過getter/setter方式訪問的成員變數

  XmlAccessType.PUBLIC_MEMBER:java物件中所有的public訪問許可權的成員變數和通過getter/setter方式訪問的成員變數

  XmlAccessType.NONE:java物件的所有屬性都不對映為xml的元素

  注意:@XmlAccessorType的預設訪問級別是XmlAccessType.PUBLIC_MEMBER,因此,如果java物件中的private成員變數設定了public許可權的getter/setter方法,就不要在   private變數上使用@XmlElement和@XmlAttribute註解,否則在由java物件生成xml時會報同一個屬性在java類裡存在兩次的錯誤。同理,如果@XmlAccessorType的訪問許可權   為XmlAccessType.NONE,如果在java的成員變數上使用了@XmlElement或@XmlAttribute註解,這些成員變數依然可以對映到xml檔案。

 [email protected]

  @XmlAccessorOrder用於對java物件生成的xml元素進行排序。它有兩個屬性值:

  AccessorOrder.ALPHABETICAL:對生成的xml元素按字母書序排序

  XmlAccessOrder.UNDEFINED:不排序

 [email protected]

  @XmlTransient用於標示在由java物件對映xml時,忽略此屬性。即,在生成的xml檔案中不出現此元素。

 [email protected]

  @XmlJavaTypeAdapter常用在轉換比較複雜的物件時,如map型別或者格式化日期等。使用此註解時,需要自己寫一個adapter類繼承XmlAdapter抽象類,並實現裡面的方法。

  @XmlJavaTypeAdapter(value=xxx.class),value為自己定義的adapter類

  XmlAdapter如下:

public abstract class XmlAdapter<ValueType,BoundType> {
    // Do-nothing constructor for the derived classes.
    protected XmlAdapter() {}
    // Convert a value type to a bound type.
    public abstract BoundType unmarshal(ValueType v);
    // Convert a bound type to a value type.
    public abstract ValueType marshal(BoundType v);
 }

演示DEMO

工具類:

package com.lgy.xml;

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class JaxbUtil {
	/** 
     * JavaBean轉換成xml 
     * 預設編碼UTF-8 
     * @param obj 
     * @param writer 
     * @return  
     */  
    public static String convertToXml(Object obj) {  
        return convertToXml(obj, "UTF-8");  
    }  
  
    /** 
     * JavaBean轉換成xml 
     * @param obj 
     * @param encoding  
     * @return  
     */  
    public static String convertToXml(Object obj, String encoding) {  
        String result = null;  
        try {  
            JAXBContext context = JAXBContext.newInstance(obj.getClass());  
            Marshaller marshaller = context.createMarshaller();  
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);  
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);  
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);
            StringWriter writer = new StringWriter();  
            marshaller.marshal(obj, writer);  
            result = writer.toString();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
        return result;  
    }  
  
    /** 
     * xml轉換成JavaBean 
     * @param xml 
     * @param c 
     * @return 
     */  
    @SuppressWarnings("unchecked")  
    public static <T> T converyToJavaBean(String xml, Class<T> c) {  
        T t = null;  
        try {  
            JAXBContext context = JAXBContext.newInstance(c);  
            Unmarshaller unmarshaller = context.createUnmarshaller();  
            t = (T) unmarshaller.unmarshal(new StringReader(xml));  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
        return t;  
    }  
}

簡單型別:
package com.lgy.xml;

import java.util.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="xmlDemo")
@XmlType(propOrder = { "author", "calendar", "price"})
public class XmlDemo {
	@XmlElement(required = true)
	private String author;

	@XmlElement(name = "price_1", required = true)
	private float price;

	@XmlElement
	private Date calendar;

	@XmlAttribute
	private Integer id;

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public float getPrice() {
		return price;
	}

	public void setPrice(float price) {
		this.price = price;
	}

	public Date getCalendar() {
		return calendar;
	}

	public void setCalendar(Date calendar) {
		this.calendar = calendar;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	@Override
	public String toString() {
		return "XmlDemo [author=" + author + ", price=" + price + ", calendar=" + calendar + ", id=" + id + "]";
	}
}

複雜型別:
package com.lgy.xml;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Generators")
@XmlType(propOrder = {"generatorsGroups"})
public class Generators {
	@XmlAttribute
	private Integer id;
	
	@XmlElement(required = true)
	private List<GeneratorsGroup> generatorsGroups;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public List<GeneratorsGroup> getGeneratorsGroups() {
		return generatorsGroups;
	}

	public void setGeneratorsGroups(List<GeneratorsGroup> generatorsGroups) {
		this.generatorsGroups = generatorsGroups;
	}

	@Override
	public String toString() {
		return "Generators [id=" + id + ", generatorsGroups=" + generatorsGroups + "]";
	}
	
}

package com.lgy.xml;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"test"})
public class GeneratorsGroup {
	@XmlElement(required = true)
	private String test;

	public String getTest() {
		return test;
	}

	public void setTest(String test) {
		this.test = test;
	}

	@Override
	public String toString() {
		return "GeneratorsGroup [test=" + test + "]";
	}
	
	
}


相關推薦

jaxb介紹以及jaxb入門

介紹順序按照:1. JAXB的介紹 2. JAXB中的核心類以及相關類介紹    3. JAXB中的常用註解介紹 4. 使用演示展示 首先介紹下什麼是JAXB? JAXB(Java Architecture for XML Binding) 是一項可以根據XML Sch

水平居中與垂直居中以及

代碼 布局 ott 水平居中 研究 背景圖 兼容性 vertical float 我以前一直都搞不清楚水平居中與垂直居中,更不用談什麽對齊,臨時抱佛腳,也找不到很好的答案,於是把網上的代碼研究了一番,總結一下經驗: 盒子水平居中:margin:0 auto 註意:在

Lucene.net(4.8.0) 學習問題記錄五: JIEba分詞和Lucene的結合以及分詞器的思考

+= d+ ext eth reac chart rdl ret start 前言:目前自己在做使用Lucene.net和PanGu分詞實現全文檢索的工作,不過自己是把別人做好的項目進行遷移。因為項目整體要遷移到ASP.NET Core 2.0版本,而Lucene使用的版本

python 讀寫json文件(dump, load)以及json格式的數據處理(dumps, loads)

ref oat ati ID == 數據轉換 load() tro float JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。 1、json.dumps()和json.loads()

Map四種獲取key和value值的方法以及map中的元素排序(轉)

compareto map.entry 排序 區別 sta hashmap 得到 package log 獲取map的值主要有四種方法,這四種方法又分為兩類,一類是調用map.keySet()方法來獲取key和value的值,另一類則是通過map.entrySet()方法來

檢視Oracle的連線以及會話操作

  #檢視當前不為空的連線select * from v$session where username is not null   #檢視不同使用者的連線數 select username,count(username) from v$session where username

一覽Swift中的常用關鍵字 Swift - final關鍵字的介紹以及使用場景

要學習Swift這門語言,就必須先了解Swift的關鍵字及對應的解釋。這裡就列一下在Swift中常用到的關鍵字。 關鍵字是類似於識別符號的保留字元序列,除非用重音符號(`)將其括起來,否則不能用作識別符號。關鍵字是對編譯器具有特殊意義的預定義保留識別符號。常見的關鍵字有以下4種。  與

[C++] STL庫函式之字串string::npos的介紹以及string中的find函式~

npos經常和find一起用~它們兩個都在標頭檔案<string>裡面~先看用法: #include <iostream> #include <string> us

REDIS學習(4)spring boot redisTemplate REDIS的簡單封裝以及引用包的說明以及序列化的詳細說明

綜合1,2,3以及目前,我們所引用的redis包不過是 <dependency> <groupId>org.springframework.boot</groupId><!-- 會附帶引進jedis-2.7.3的包 -->

在Linux下使用makefile寫一個進度條以及\r 和\n緩衝區的簡單瞭解

1.’\r’和‘\n’的區別 \r:表示回車:它只會回到這一行的最前邊 \n:表示回車換行。它會回到這一行的最前邊,然後跳到下一行  。 2.緩衝區 c函式如printf(),在輸出時,shell預設將資料輸出到標準輸出如顯示器,而printf()在

vue 項目總結以及未來的理解性能方面的認知

自動化處理 在一起 管理 模塊 寫法 註冊 個數 start 分析 之前自己寫了一個vue項目,因為沒有經驗,所以很多方面的提升做的不好,比如說路由、比如說ajax都沒有封裝,比如說業務邏輯和通用邏輯都混合在一起,導致大片大片重復的代碼累積。忽悠忽悠沒入門的前端感覺還是很好

巨集觀的力學中連續介質假設的理解以及流體力學中平均速度的理解

對巨集觀的力學中連續介質假設的理解: 巨集觀的力學(如流體力學、彈塑性力學等)研究的物件是大量分子的集合,這時候每個集合構成一個個小微元體,整個物件就是由這無數個小微元體連續無間隙地構成。因為我們只需要關注每個集合上物件的性質,如密度、速度、應力、形變等,不需要

springboot整合mybatis-plus以及mybatis-plus入門使用

mybatis-plus是基於mybatis,相對於mybatis,他有許多特性是比較好用的,比如分頁查詢、表字段自動轉換為實體類屬性等,使用mybatis-plus與Spring Data JPA有點相似的地方,個人覺得mybatis-plus的分頁比JPA的分頁好用。其實

Redis詳細介紹以及在SpringBoot中的簡單使用

1.Redis的特點:   (1)Redis支援資料的持久化,可以將記憶體中的資料儲存到磁碟中,下次啟動的時候可以直接載入磁碟中的資料;   (2)Redis不僅可以儲存key-value型別的資料,還可以儲存List、Set、hash、zset等資料結構的資料;

過濾器通過HttpServletResponseWrapper包裝HttpServletResponse實現獲取response中的返回資料以及資料進行gzip壓縮

前幾天我們專案總監給了我一個任務,就是將請求的介面資料進行壓縮,以達到節省流量的目的。 對於實現該功能,有以下思路: 1.獲取到response中的值, 2.對資料進行gzip壓縮(因為要求前端不變,所以只能選在這個瀏覽器都支援的壓縮方式) 3.將資料寫

《連載 | 物聯網框架ServerSuperIO教程》- 14.配製工具介紹以及裝置驅動、檢視驅動、服務例項的掛載

目       錄 14.配製工具介紹,以及裝置驅動、檢視驅動、服務例項的掛載... 2 14.1        概述... 2 14.2        掛載裝置驅動... 2 14.3        掛載顯示檢視... 4 14.4 

Comet4j部署以及Jfinal以及Zcurd專案的支援

範例及所需基礎資源包請參考《參考連結》。對於基礎jar包及js,參考連結中為google連結,被牆的小夥伴可從以下連結下載: 2、部署注意事項: 1)、comet4j僅支援tomcat伺服器且目前僅支援6、7版本,8尚未考證,據說使用7的jar包也能支援。 2)

kafka基本原理介紹以及重新選舉replica複製機制isr等。

最近做的專案,通過資料庫的log日誌將資料庫某些千萬量級的表(這些表需要聯表查詢)資料同步到elasticsearch中,以減輕資料庫的查詢壓力,其中以kafka作為訊息中介軟體,以下是做該專案過程中對kafka的一些整理。 一、中介軟體 中介軟體,用於業務對於資料的時效

異常處理 try...catch...finally 執行順序 以及返回值得影響

異常處理 try...catch...finally 執行順序, 以及對返回值得影響 結論:1、不管有沒有出現異常,finally塊中程式碼都會執行;2、當try和catch中有return時,finally仍然會執行;3、finally是在return後面的表示式運算後執行的(此時並沒有返回運算後的值,而

【無監督學習】DBSCAN聚類演算法原理介紹以及程式碼實現

前言:無監督學習想快一點複習完,就轉入有監督學習 聚類演算法主要包括哪些演算法?主要包括:K-m