前面介紹了兩種常用的解析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類