XML與Java類映射JAXB

 

前面介紹了兩種常用的解析XML的API,但是

1.什麼是XML與Java類的映射?

        在Java應用程序中,通常要將XML解析成一個Java對象。例如,有xml數據如下:

<?xml version="1.0" encoding="UTF-8"?>
<articles>
    <article category="xml">
        <title>XML 概述</title>
        <author>janet</author>
        <email>[email protected]</email>
        <date>20080809</date>
    </article>
    <article category="java">
        <title>Java書籍</title>
        <author>XXX君</author>
        <email>[email protected]</email>
        <date>20100212</date>
    </article>
</articles>


 

有一個Java類如下:

package com.wch.jaxb;

public class Article {
	private String title;
	private String author;
	private String email;
	private String date;
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
}


那麼後續的動作就是讓xml中的元素對應到Java類中來,讓<article>元素中的<title>對應title,<author>對應authority等等,那麼這種xml數據與Java類之間的對應關係,就是一種映射

 

2.JAXB的工作原理?

 

     JAXB提供了一個快速而方便的方式綁定XML Schemas和Java,是Java程序員能夠很方便的在Java應用程序中處理XML數據。JAXB提供了將XML文檔解組爲java內容樹的方法,以及將java內容樹重新編組回XML文檔的方法。JAXB同樣也提供了一種從java對象生成XML Schema的方式。

      編組:(Marshalling)是把內存中的數據轉化到存儲媒介上的過程。因此在 Java 和 XML 環境中,編組就是把一些 Java 對象轉化成一個(或多個) XML 文檔。在數據庫環境中,則是把 Java 表示的數據存入數據庫。顯然,編組的祕密在於把 Java 實例中的面向對象結構轉化成適用於 XML 的 扁平結構,或者 RDBMS 中的關係結構(使用 Java 技術轉換到 OODBMS 實際上很簡單)。工作原理如下圖所示:

 

      解組:(Unmarshalling) 是把數據從存儲媒介轉換到內存中的過程--正好與編組相反。因此需要把 XML 文檔解組到 Java VM 中。這裏的複雜性不是在扁平數據中,因爲這不是必需的,而在於從正確的數據到正確的 Java 代碼變量的映射。如果映射是錯誤的,就不可能正確地訪問數據。當然,如果再嘗試重新編組還會造成更大的問題,並且問題傳播得很快。工作原理如下圖所示:

       往返(Round-tripping)可能是最重要也最容易誤解的數據綁定術語。往返用於描述從存儲媒介到內存然後回到存儲媒介的完整循 環。在 XML 和 Java 技術環境中,這就意味着從 XML 文檔到 Java 實例變量,然後再回到 XML 文檔。正確的往返要求,如果中間沒有修改數據,XML 輸入和 XML 輸出應該是等同的。

 

3.Java對象轉換成XML:

     可以使用配置文件,也可以使用註解。

@XmlRootElement
public class Article {
	private String title;
	private String author;
	private String email;
	private String date;
	public String getTitle(

@XmlRootElement用於標註XML的根元素,一旦標註了根元素,那麼這個類的所有屬性,默認映射爲根元素的子元素。

 

4.建立測試類:


 

package com.wch.jaxb;

import static org.junit.Assert.*;

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.transform.Result;

import org.junit.Test;

public class TestJaxb {

	@Test
	public void test() {
		File xmlFile = new File("E:/Eclipse1/DomXml/src/com/wch/xml/testJaxb.xml");
		//聲明JAXBContext上下文對象
		JAXBContext context;
		try {
			context = JAXBContext.newInstance(Article.class);
			//通過上下文創建Java轉換成XML的對象Marshaller
			Marshaller m = context.createMarshaller();
			//創建XML中的數據
			Article article = new Article();
			article.setAuthor("彩虹");
			article.setTitle("人生的感悟");
			article.setEmail("[email protected]");
			article.setDate("20120112");
			//將Java對象轉換到xml
			m.marshal(article,xmlFile);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


就會在響應的目錄下生成對應的xml文件

 

那麼,將xml轉換爲Java對象就不必說了吧,大同小異,但是需要用到Unmarshaller類

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章