1. 程式人生 > >xml與java物件對映

xml與java物件對映

JAXB提供了XML到java物件(類)之間的相互對映(轉換),我們可以利用JAXB來消除繁瑣的XML解析工作。

下面是引用oracle網站中有關jaxb的一句話。

Now developers have another Java API at their disposal that can make it easier to access XML documents: . A Reference Implementation of the API is now available in the Java Web Services Developer Pack V 1.1.

JAXB包括兩部分:

1.編譯器程式:負責根據XML Schema(xsd檔案)編譯生成對應java類檔案

2.JAXB API:程式中呼叫這些api,再結合1中的類達到對映的目的

本篇將主要針對api部分給出程式碼示例,並在後文中給出文件校驗的方法。

無論是將xml對映為java物件還是將java物件對映為xml,都首先要使用JAXB的編譯器將XSD檔案編譯成java類檔案,然後在專案中匯入這些類。

需要引用一下類:

Java程式碼  收藏程式碼
  1. import javax.xml.bind.JAXBContext;  
  2. import javax.xml.bind.JAXBException;  
  3. import
     javax.xml.bind.Marshaller;  
  4. import javax.xml.bind.Unmarshaller;  
 

A. 將XML對映為java物件

Java程式碼  收藏程式碼
  1. // 建立上下文 amos.note為編譯器生成的類檔案的包名稱
  2. JAXBContext jaxbContext = JAXBContext.newInstance("amos.note");  
  3. // 建立unmashaller物件
  4. Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();  
  5. // 將xml檔案對映為java物件
  6. Note note = (Note) unmarshaller.unmarshal(new
     File("e:/t/t.xml"));  
  7. // TODO ....

 以上程式碼片段就是將t.xml檔案中的根Note節點對映為了Note物件,也可以將其他形式的xml進行對映。

B. 將java物件對映為XML

Java程式碼  收藏程式碼
  1. // 準備要對映的物件 amos.note.ObjectFactory是編譯器生成的類
  2. amos.note.ObjectFactory objFactory = new amos.note.ObjectFactory();  
  3. Note note = objFactory.createNote();  
  4. //上面的note物件也可是A部分中的那個note物件,這樣A、B兩個步驟和在一起就是對xml檔案的更新了
  5. // 建立上下文 amos.note為編譯器生成的類檔案的包名稱
  6. JAXBContext jaxbContext = JAXBContext.newInstance("amos.note");  
  7. // 建立mashaller物件
  8. Marshaller marshaller = jaxbContext.createMarshaller();  
  9. // 將java物件對映為xml檔案
  10. marshaller.marshal(note, new FileOutputStream("e:/t/t.xml"));  

 以上程式碼片段就是將Note物件對映為t.xml檔案中的根Note節點,也可以對映成為其他形式的物件。

基於XSDXML文件校驗

Java 5 引入了 javax.xml.validation 包,提供了獨立於模式語言的驗證服務介面。這個包也可用於 Java 1.3 及更高版本,不過要單獨安裝 JAXP 1.3。其他產品中,Xerces 2.8 包含了這個庫的實現。

javax.xml.validation API 使用三個類來驗證文件:SchemaFactorySchema 和 Validator。還大量使用了 TrAX javax.xml.transform.Source 介面來表示 XML 文件。簡言之,SchemaFactory 讀取模式文件(通常是 XML 檔案)並建立 Schema 物件。Schema 建立一個 Validator 物件。最後,Validator 物件驗證表示為 Source 的 XML 文件。

改變驗證所依據的模式、要驗證的文件甚至使用的模式語言都很簡單。但無論什麼情況,驗證都需要經過下列五個步驟:

1) 為編寫模式所用的語言載入一個模式工廠。

2) 編譯原始檔中的模式。

3) 用編譯後的模式建立一個驗證程式。

4) 為需要驗證的文件建立 Source 物件。StreamSource 通常最簡單。

5) 驗證輸入的源文件。如果文件無效,validate() 方法將丟擲 SAXException。否則什麼也不顯示。

可以反覆使用同一個驗證程式和同一個模式多次。但是所有類都不是執行緒安全的或者可重入的。如果用多個執行緒同時驗證,一定要保證每個執行緒有自己的 Validator 和 Schema 物件。

需要匯入的包:

Java程式碼  收藏程式碼
  1. import javax.xml.transform.Source;  
  2. import javax.xml.transform.stream.StreamSource;  
  3. import javax.xml.validation.Schema;  
  4. import javax.xml.validation.SchemaFactory;  
  5. import javax.xml.validation.Validator;  
 

下面是驗證的主要程式碼:

Java程式碼  收藏程式碼
  1. /** 
  2.      * 根據xsd檔案校驗一個xml檔案是否有效,當無效異常時交由errorHandler處理異常 
  3.      *  
  4.      * @param xmlFilePath 
  5.      * @param xsdFilePath 
  6.      * @param errorHandler 
  7.      * @return 
  8.      * @throws IOException 
  9.      * @throws SAXException 
  10.      */
  11.     privateboolean doValidate(String xmlFilePath, String xsdFilePath,  
  12.             ErrorHandler errorHandler) throws IOException, SAXException {  
  13.         boolean rt = false;  
  14.         // 1. Lookup a factory for the W3C XML Schema language
  15.         SchemaFactory factory = SchemaFactory  
  16.                 .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);  
  17.         // 2. Compile the schema.
  18.         // Here the schema is loaded from a java.io.File, but you could use
  19.         // a java.net.URL or a javax.xml.transform.Source instead.
  20.         File schemaLocation = new File(xsdFilePath);  
  21.         Schema schema = factory.newSchema(schemaLocation);  
  22.         // 3. Get a validator from the schema.
  23.         Validator validator = schema.newValidator();  
  24.         validator.setErrorHandler(errorHandler);  
  25.         // 4. Parse the document you want to check.
  26.         Source source = new StreamSource(xmlFilePath);  
  27.         // 5. Check the document
  28.         try {  
  29.             validator.validate(source);  
  30.             rt = true;  
  31.         } catch (SAXException ex) {  
  32.             rt = false;  
  33.         }  
  34.         return rt;  
  35.     }  

需要注意的是,當傳入有效的ErrorHandler示例後,執行validator.validate(source)方法時無論是否出現異常都不在丟擲SAXException異常。

因此,下面的方法包裝上面的方法來驗證

Java程式碼  收藏程式碼
  1. /** 
  2.      * 根據xsd檔案校驗一個xml檔案是否有效 
  3.      * @param xmlFilePath 
  4.      * @param xsdFilePath 
  5.      * @return true-有效 false-無效 
  6.      * @throws IOException 
  7.      * @throws SAXException 
  8.      */
  9.     publicboolean validate(String xmlFilePath, String xsdFilePath) throws IOException, SAXException{  
  10.         returnthis.doValidate(xmlFilePath, xsdFilePath, null);  
  11.     }  
  12.     /** 
  13.      * 根據xsd檔案校驗一個xml檔案是否有效,當無效異常時交由errorHandler處理異常 
  14.      * @param xmlFilePath 
  15.      * @param xsdFilePath 
  16.      * @param errorHandler 
  17.      * @throws IOException 
  18.      * @throws SAXException 
  19.      */
  20.     publicvoid validate(String xmlFilePath, String xsdFilePath, ErrorHandler errorHandler) throws IOException, SAXException{  
  21.         boolean rt = this.doValidate(xmlFilePath, xsdFilePath, errorHandler);  
  22.     }  

其實,驗證的這個步驟不必單獨佔用一些列資源而只做這一件事,可以在上面的對映過程中完成,oracle網站上提供了驗證的說明,但是我自己測試發現他說的方法已經廢棄了,因此,沒有在對映的程式碼中提到,還有待研究。

附件xml.zip是完整的示例程式

相關推薦

xmljava物件對映

JAXB提供了XML到java物件(類)之間的相互對映(轉換),我們可以利用JAXB來消除繁瑣的XML解析工作。 下面是引用oracle網站中有關jaxb的一句話。 Now developers have another Java API at their disposal that can make i

xstream--xml工具類--java物件轉換JSONObject、xmljava物件互轉

工作環境: myeclipse2013、jdk1.8、fastjson1.1.41、xstream1.4.3 import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.Writer;

mybatis-plus中自動配置的 mapper.xmljava介面對映問題

本來沒有mybatis-plus的話,這個工作是通過mybatis-spring的MapperScan來完成的。 Mybatis-plus中的自動配置類MybatisPlusAutoConfiguration.class中有一個靜態內部類MapperScannerRegistrarN

使用XStream是實現XMLJava物件的轉換(6)--持久化

九、持久化 在第八節的示例中,當我們操作一組物件時,我們可以指定Writer、OutputStream來寫出序列化後的XML資料,我們還可以指定Reader、InputStream來讀取序列化後的XML資料。當我們需要寫出和讀取檔案時都需要指定輸入輸出流,並且需要明確的呼叫輸入輸出方法來實現Java物件的序

使用XStream是實現XMLJava物件的轉換(2)--別名

五、使用別名(Alias) 首先,有這樣一段Java程式碼: import java.util.ArrayList; import java.util.List; import com.thoughtworks.xstream

xmljava物件之間的相互轉化

Java和xml的互相轉換,依靠強大的JAXBContext可以輕鬆實現。 下面通過一個簡單案例學習一下JAXBContext 首先準備好一個JavaBean供實驗: 注意 1、類檔案註解:@XmlRootElement不可缺少 2、2個Student的構造方法不能少

java xml實體物件 互相轉換

本文轉載至:http://blog.csdn.net/sd4015700/article/details/39474893 最近在專案中一直出現Java物件和XML之間的相互轉換,一開始由於專案很龐大,我又是臨時排程過去,導致在按照專案組長的要求進行寫程式碼的同時,總是在這塊雲裡霧裡,最近才慢慢

JAXBContext轉換包含集合屬性的xmljava集合物件Demo

核心類: package com.jaxb; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; impo

使用XStream是實現XMLJava對象的轉換(2)--別名

name have ret lis sea sil 數組 ttr auth 五、使用別名(Alias) 首先,有這樣一段Java代碼: Java代碼 import java.util.ArrayList; import java.util.List;

使用XStream是實現XMLJava對象的轉換(6)--持久化

light 自己的 map stc title 指定 reg 對象 框架 九、持久化 在第八節的示例中,當我們操作一組對象時,我們可以指定Writer、OutputStream來寫出序列化後的XML數據,我們還可以指定Reader、InputStream來讀取序列化後的XM

使用XStream是實現XMLJava對象的轉換(5)--Object Stream

控制 () oid dex 關閉 ava -o setname otf 八,Object Stream 之前的例子我們都是直接輸出Xml成為String類型或者從String中獲得並解析Xml,現在我們要處理輸入流和輸出流! 1,輸出流(ObjectOutputStrea

xmljava代碼相互裝換的工具類

children ace final port 使用 || 註釋 shee turn 這是一個java操作xml文件的工具類,最大的亮點在於能夠通過工具類直接生成xml同樣層次結構的java代碼,也就是說,只要你定義好了xml的模板,就能一鍵生成java代碼。省下了自己再使

JSONJava物件的互相轉換

JSON與Java物件的互相轉換 例一(單個物件進行賦值): @RequestMapping("test1.do") @ResponseBody public JSONObject test1(HttpServletRequest request, HttpServletResponse

JAXB 深入顯出 - JAXB 教程 XMLJava物件初探(Unmarshaller)

摘要: JAXB 作為JDK的一部分,能便捷地將Java物件與XML進行相互轉換,本教程從實際案例出發來講解JAXB 2 的那些事兒。完整版目錄 前情回顧 之前介紹的都是將Java物件轉換為XML,這一節開始,將講述XML資料轉換為JAVA物件。 資料準備 現在有一段XM

JAXB 深入顯出 - JAXB 教程 XMLJava物件深入(Unmarshaller)

摘要: JAXB 作為JDK的一部分,能便捷地將Java物件與XML進行相互轉換,本教程從實際案例出發來講解JAXB 2 的那些事兒。完整版目錄 前情回顧 上一節以簡單介紹了 UnMarshaller 的過程,主要介紹了多種資料來源如何處理。這一節將深入介紹XML資料轉換為JAV

Json物件Json字串的轉化、JSON字串Java物件的轉換

1.jQuery外掛支援的轉換方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以將json字串轉換成json物件 2.瀏覽器支援的轉換方式(Firefox,chrome,opera,safari

js中處理json Json物件Json字串的轉化、JSON字串Java物件的轉換

轉:https://www.cnblogs.com/zq-boke/p/5833387.html Json物件與Json字串的轉化、JSON字串與Java物件的轉換   一.Json物件與Json字串的轉化 1.jQuery外掛支援的轉換方式:   $.pars

javax.xml + java.io xmljava物件互轉工具類

import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshall

JSON資料Java物件相互轉換

整理下json資料與Java物件轉換。 使用的jar包: ClassGrade類: import java.util.ArrayList; import java.util.List; public class ClassGrade { private String

XStream輕鬆轉換xmljava物件

首先引入所需的jar: xstream-1.4.9、xpp3_min-1.1.4c、dom4j-1.6.1, 或用maven管理jar包時在pom.xml中新增: <!-- https://mvnrepository.com/artifact/com.thought