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程式碼- import javax.xml.bind.JAXBContext;
- import javax.xml.bind.JAXBException;
- import
- import javax.xml.bind.Unmarshaller;
A. 將XML對映為java物件
Java程式碼- // 建立上下文 amos.note為編譯器生成的類檔案的包名稱
- JAXBContext jaxbContext = JAXBContext.newInstance("amos.note");
- // 建立unmashaller物件
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- // 將xml檔案對映為java物件
- Note note = (Note) unmarshaller.unmarshal(new
- // TODO ....
以上程式碼片段就是將t.xml檔案中的根Note節點對映為了Note物件,也可以將其他形式的xml進行對映。
B. 將java物件對映為XML
Java程式碼- // 準備要對映的物件 amos.note.ObjectFactory是編譯器生成的類
- amos.note.ObjectFactory objFactory = new amos.note.ObjectFactory();
- Note note = objFactory.createNote();
- //上面的note物件也可是A部分中的那個note物件,這樣A、B兩個步驟和在一起就是對xml檔案的更新了
- // 建立上下文 amos.note為編譯器生成的類檔案的包名稱
- JAXBContext jaxbContext = JAXBContext.newInstance("amos.note");
- // 建立mashaller物件
- Marshaller marshaller = jaxbContext.createMarshaller();
- // 將java物件對映為xml檔案
- marshaller.marshal(note, new FileOutputStream("e:/t/t.xml"));
以上程式碼片段就是將Note物件對映為t.xml檔案中的根Note節點,也可以對映成為其他形式的物件。
基於XSD的XML文件校驗
Java 5 引入了 javax.xml.validation 包,提供了獨立於模式語言的驗證服務介面。這個包也可用於 Java 1.3 及更高版本,不過要單獨安裝 JAXP 1.3。其他產品中,Xerces 2.8 包含了這個庫的實現。
javax.xml.validation API 使用三個類來驗證文件:SchemaFactory、Schema 和 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程式碼- import javax.xml.transform.Source;
- import javax.xml.transform.stream.StreamSource;
- import javax.xml.validation.Schema;
- import javax.xml.validation.SchemaFactory;
- import javax.xml.validation.Validator;
下面是驗證的主要程式碼:
Java程式碼- /**
- * 根據xsd檔案校驗一個xml檔案是否有效,當無效異常時交由errorHandler處理異常
- *
- * @param xmlFilePath
- * @param xsdFilePath
- * @param errorHandler
- * @return
- * @throws IOException
- * @throws SAXException
- */
- privateboolean doValidate(String xmlFilePath, String xsdFilePath,
- ErrorHandler errorHandler) throws IOException, SAXException {
- boolean rt = false;
- // 1. Lookup a factory for the W3C XML Schema language
- SchemaFactory factory = SchemaFactory
- .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
- // 2. Compile the schema.
- // Here the schema is loaded from a java.io.File, but you could use
- // a java.net.URL or a javax.xml.transform.Source instead.
- File schemaLocation = new File(xsdFilePath);
- Schema schema = factory.newSchema(schemaLocation);
- // 3. Get a validator from the schema.
- Validator validator = schema.newValidator();
- validator.setErrorHandler(errorHandler);
- // 4. Parse the document you want to check.
- Source source = new StreamSource(xmlFilePath);
- // 5. Check the document
- try {
- validator.validate(source);
- rt = true;
- } catch (SAXException ex) {
- rt = false;
- }
- return rt;
- }
需要注意的是,當傳入有效的ErrorHandler示例後,執行validator.validate(source)方法時無論是否出現異常都不在丟擲SAXException異常。
因此,下面的方法包裝上面的方法來驗證
Java程式碼- /**
- * 根據xsd檔案校驗一個xml檔案是否有效
- * @param xmlFilePath
- * @param xsdFilePath
- * @return true-有效 false-無效
- * @throws IOException
- * @throws SAXException
- */
- publicboolean validate(String xmlFilePath, String xsdFilePath) throws IOException, SAXException{
- returnthis.doValidate(xmlFilePath, xsdFilePath, null);
- }
- /**
- * 根據xsd檔案校驗一個xml檔案是否有效,當無效異常時交由errorHandler處理異常
- * @param xmlFilePath
- * @param xsdFilePath
- * @param errorHandler
- * @throws IOException
- * @throws SAXException
- */
- publicvoid validate(String xmlFilePath, String xsdFilePath, ErrorHandler errorHandler) throws IOException, SAXException{
- boolean rt = this.doValidate(xmlFilePath, xsdFilePath, errorHandler);
- }
其實,驗證的這個步驟不必單獨佔用一些列資源而只做這一件事,可以在上面的對映過程中完成,oracle網站上提供了驗證的說明,但是我自己測試發現他說的方法已經廢棄了,因此,沒有在對映的程式碼中提到,還有待研究。
附件xml.zip是完整的示例程式
相關推薦
xml與java物件對映
JAXB提供了XML到java物件(類)之間的相互對映(轉換),我們可以利用JAXB來消除繁瑣的XML解析工作。 下面是引用oracle網站中有關jaxb的一句話。 Now developers have another Java API at their disposal that can make i
xstream--xml工具類--java物件轉換JSONObject、xml與java物件互轉
工作環境: myeclipse2013、jdk1.8、fastjson1.1.41、xstream1.4.3 import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.Writer;
mybatis-plus中自動配置的 mapper.xml與java介面對映問題
本來沒有mybatis-plus的話,這個工作是通過mybatis-spring的MapperScan來完成的。 Mybatis-plus中的自動配置類MybatisPlusAutoConfiguration.class中有一個靜態內部類MapperScannerRegistrarN
使用XStream是實現XML與Java物件的轉換(6)--持久化
九、持久化 在第八節的示例中,當我們操作一組物件時,我們可以指定Writer、OutputStream來寫出序列化後的XML資料,我們還可以指定Reader、InputStream來讀取序列化後的XML資料。當我們需要寫出和讀取檔案時都需要指定輸入輸出流,並且需要明確的呼叫輸入輸出方法來實現Java物件的序
使用XStream是實現XML與Java物件的轉換(2)--別名
五、使用別名(Alias) 首先,有這樣一段Java程式碼: import java.util.ArrayList; import java.util.List; import com.thoughtworks.xstream
xml與java物件之間的相互轉化
Java和xml的互相轉換,依靠強大的JAXBContext可以輕鬆實現。 下面通過一個簡單案例學習一下JAXBContext 首先準備好一個JavaBean供實驗: 注意 1、類檔案註解:@XmlRootElement不可缺少 2、2個Student的構造方法不能少
java xml與實體物件 互相轉換
本文轉載至:http://blog.csdn.net/sd4015700/article/details/39474893 最近在專案中一直出現Java物件和XML之間的相互轉換,一開始由於專案很龐大,我又是臨時排程過去,導致在按照專案組長的要求進行寫程式碼的同時,總是在這塊雲裡霧裡,最近才慢慢
JAXBContext轉換包含集合屬性的xml與java集合物件Demo
核心類: package com.jaxb; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; impo
使用XStream是實現XML與Java對象的轉換(2)--別名
name have ret lis sea sil 數組 ttr auth 五、使用別名(Alias) 首先,有這樣一段Java代碼: Java代碼 import java.util.ArrayList; import java.util.List;
使用XStream是實現XML與Java對象的轉換(6)--持久化
light 自己的 map stc title 指定 reg 對象 框架 九、持久化 在第八節的示例中,當我們操作一組對象時,我們可以指定Writer、OutputStream來寫出序列化後的XML數據,我們還可以指定Reader、InputStream來讀取序列化後的XM
使用XStream是實現XML與Java對象的轉換(5)--Object Stream
控制 () oid dex 關閉 ava -o setname otf 八,Object Stream 之前的例子我們都是直接輸出Xml成為String類型或者從String中獲得並解析Xml,現在我們要處理輸入流和輸出流! 1,輸出流(ObjectOutputStrea
xml與java代碼相互裝換的工具類
children ace final port 使用 || 註釋 shee turn 這是一個java操作xml文件的工具類,最大的亮點在於能夠通過工具類直接生成xml同樣層次結構的java代碼,也就是說,只要你定義好了xml的模板,就能一鍵生成java代碼。省下了自己再使
JSON與Java物件的互相轉換
JSON與Java物件的互相轉換 例一(單個物件進行賦值): @RequestMapping("test1.do") @ResponseBody public JSONObject test1(HttpServletRequest request, HttpServletResponse
JAXB 深入顯出 - JAXB 教程 XML轉Java物件初探(Unmarshaller)
摘要: JAXB 作為JDK的一部分,能便捷地將Java物件與XML進行相互轉換,本教程從實際案例出發來講解JAXB 2 的那些事兒。完整版目錄 前情回顧 之前介紹的都是將Java物件轉換為XML,這一節開始,將講述XML資料轉換為JAVA物件。 資料準備 現在有一段XM
JAXB 深入顯出 - JAXB 教程 XML轉Java物件深入(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 xml和java物件互轉工具類
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輕鬆轉換xml和java物件
首先引入所需的jar: xstream-1.4.9、xpp3_min-1.1.4c、dom4j-1.6.1, 或用maven管理jar包時在pom.xml中新增: <!-- https://mvnrepository.com/artifact/com.thought