1、認識XML解析技術
1.1、XML相關概念
(1)DTD:XML語法規則,是XML文件的驗證機制,可以通過比較XML文檔和DTD文件看文檔是否符合規範,元素和標籤是否使用正確。
(2)XML是SOA的基礎。
1.2、XML處理技術
(1)為了使用XML,我們需要通過XML處理器或XMLAPI來訪問數據,目前JAXP提供了2種處理XML的方法:DOM和SAX。
①DOM:DOM通過編程方式對XML文檔中數據及結構進行訪問,基於XML文檔在內存中的樹狀結構。其缺點是將整個XML文檔裝入內存需要很大開銷。
②SAX:基於事件驅動,用到一段解析一段,解決了DOM佔用內存大的問題,但其缺點是無法隨機訪問文檔。
(2)為了解決DOM和SAX的問題,一種基於流的StreamAPIforXML(簡稱StAX)出現了,目前已加入到JDK6的JAXP1.4裡面,StAX也是基於事件驅動。
(3)DOM、SAX和StAX都是從文檔結構出發處理XML的,但很多應用程序僅僅關注文檔數據本身,所以XML數據綁定技術應運而生。
數據綁定:是指將數據從存儲媒介(XML文檔和數據庫中)抽取出來,並通過程序表示這些數據的過程,即把數據綁定到虛擬機能夠理解並且可以操作的某種內存結構中。
XML綁定框架:Castor,JAXB,JiBX,Quick,Zeus等。
2、XML處理利器:XStream
2.1、XStream概述
(1)XStream是一套簡潔易用的開源框架,用於將Java對象序列化為XML,或者將XML反序列化為Java對象。 XStream主要特點:
(2)XStream架構組成:
Converters(轉換器):當XStream遇到需要轉換的對象時,它會委派給合適的轉換器實現。
IO(輸入/輸出):XStream是通過HierarchicalStreamWriter和HierarchicalStreamReader從底層XML數據中抽象而來,分別用於序列化和反序列化操作。
Context(上下文):XStream序列化反序列化對象時會創建2個類MarshallingContext和UnmarshallingContext,由塔門來處理數據並委派給合適的轉換器。
Facade(統一入口):將上面的3點集成在一起,以統一的接口開放給用戶使用。
2.2、快速入門
(1)創建一個XStream,並指定XML解析器
XStreamxstream=newXStream(newDomDriver());
如果不指定解析器,XStream會默認採用XPP(XMLPullParser)解析器,XPP是一種高速解析器。
(2)示例如下:
2.3、使用XStream別名
(1)在上面的示例中,java對象的全類名對應XML文件的根元素,屬性名對應XML文件的節點元素,但在實際情況中,java對象和XML對象可能都已經定義好了名字,這時就需要使用別名映射。
XStream有3種別名配置情況:
類別名:用alias(Stringname,Classtype)。
類成員別名:用aliasField(Stringalias,ClassdefinedIn,StringfieldName)。
類成員作為屬性別名:用aliasAttribute(ClassdefinedIn,StringattributeName,Stringalias),單獨命名沒有意義,還要通過useAttributeFor(ClassdefinedIn,StringfieldName)應用到某個類上。
(2)通過別名修改2.2中示例:
2.4、XStream轉換器
在開發過程中,有時候需要轉換一些自定義的類型,只要實現Converter接口,並調用XStream的registerConverter()方法註冊轉換器就可以。
2.5、XStream註解
(1)XStream常用註解如下:
(2)使用
XStreamxstream=newXStream(newDomDriver());
加載對像有2種方式:
①方式一:
xstream.processAnnotations(AAA.class);
xstream.processAnnotations(BBB.class);
②方式二:
xstream.autodetectAnnotations(true);//自動加載註解bean,而且還緩存了標註的對象
2.6、流化對象
(1)XStream為ObjectInputStream和ObjectOutputStream提供了替代實現,允許以對象流的方式進行XML序列化或反序列化操作。前面是基於DOM的XML解析器讀取的XML,這裡我們顯然應該使用流的方式進行解析。
示例如下:
(2)使用PrettyWriter和CompactWriter的區別就在於PrettyWriter會格式化生成的XML,而CompactWriter會壓縮生成的XML。
2.7、持久化API
(1)XStream提供了一套簡單的方式,可以將集合中的對象持久化到文件中,如:XmlArrayList、XmlSet、XmlMap等。
(2)在創建集合之前,還需要指定一個持久化策略PersistenceStrategy。
2.8、處理JSON
(1)XML在WebService中有不可動搖的地位,但是在大多數web應用中,還是多采用輕量級的JSON作為數據交換格式。
(2)XStream提供了JettisonMappedXmlDriver和JsonHierarchicalStreamDriver來完成java對象和json的轉換工作。
示例如下:
(3)JettisonMappedXmlDriver和JsonHierarchicalStreamDriver的區別:
①JettisonMappedXmlDriver生成的是壓縮的JSON,而JsonHierarchicalStreamDriver生成的是格式化的JSON。
②要想將JSON轉換為對象,只能使用JettisonMappedXmlDriver。
3、其他常見的O/XMapping開源項目
JAXB、XMLBeans、Cstor、JiBX的比較:
4、與SpringOXM整合
4.1、SpringOXM概述
(1)SpringOXM對主流O/XMapping框架做了一個統一的抽象和封裝,Marshaller和Unmarshaller是SpringOXM兩個核心接口。 Marshaller用於將對象轉成XML,Unmarshaller用於將XML轉成對象。
(2)各O/XMapping組件包裝器如下:
4.2、在Spring中進行配置
(1)XStreamMarshaller配置實例:
5、小結
(1)java應用程序的XML數據綁定可以歸納為2種方式:
根據XML文檔生成Java語言代碼(如JAXB、XMLBeans、Castor)。
使用某種形式的映射綁定方法,也就是設定Java類如何與XML進行關聯(如XStream、Castor、JiBX)。
(2)2種方式比較:
使用由Schema或DTD定義的穩定文檔結構,並且該結構適合應用程序的需要,則代碼生成方法可能是最佳選擇。
如果使用現有的Java類,或者希望使用類的結構,該結構反映應用程序對數據的用法,而不是XML結構,則映射方法是最佳選擇。
總結
以上就是本文關於spring使用OXM進行對象XML映射解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!