spring使用OXM进行对象XML映射解析
作者:末日流云18 发布时间:2022-11-11 16:05:19
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结构,则映射方法是最佳选择。
来源:http://blog.csdn.net/qq_29583513/article/details/52524617


猜你喜欢
- 网络爬虫在信息检索与处理中有很大的作用,是收集网络信息的重要工具。接下来就介绍一下爬虫的简单实现。爬虫的工作流程如下爬虫自指定的URL地址开
- 效果图在开发APP中,经常要实现圆形头像,那么该如何实现呢?要裁剪吗,要重写draw函数吗?不用,只用一行代码就可以实现Glide实现圆形图
- int a = 5; int b = 30; Console.WriteLine(a^b);&n
- 本文实例为大家分享了Android设置默认锁屏壁纸接口的具体代码,供大家参考,具体内容如下完成自定义service后,接下来就是具体实现接口
- 一款书籍阅读器,需要以下功能才能说的上比较完整:文字页面展示,即书页;页面之间的跳转动画,即翻页动作;能够在每一页上记录阅读进度,即书签;能
- 本文实例讲述了C#利用System.Uri转URL为绝对地址的方法。分享给大家供大家参考。具体分析如下:在使用ASPOSE.Word生成Wo
- Android开发文档上专门有一小节解释这个问题。简单来说,Activity是负责与用户交互的最主要机制,任何“设置”(Configurat
- 1.RecycledPool的重用场景以及使用:多个RecyclerView出现,并且他们的item布局结构一致,这时候可以进行重用。在进行
- 哈夫曼(Huffman)编码是一种常用的压缩编码方法,是 Huffman 于 1952 年为压缩文本文件建立的。它的基本原理是频繁使用的数据
- 1.使用的注意事项本节给大家带来基础UI控件部分的最后一个控件:DrawerLayout,官方给我们提供的一个侧滑菜单控件,和上一节的Vie
- APP启动速度非常重要,APP启动速度慢,可能会造成用户体验不良好,尤其是在最近用Android studio之后,如果长时间不打开app,
- 本文实例为大家分享了Android列表时间轴展示的具体代码,供大家参考,具体内容如下实现的效果图如下:实现的方式是利用recycleview
- 工厂模式定义:提供创建对象的接口。为何使用工厂模式工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java
- 一、ReentrantLock可重入锁可重入锁ReentrantLock 是一个互斥锁,即同一时间只有一个线程能够获取锁定资源,执
- 昨天有个刚学java的师弟发了个程序给我,说死活编译不过,老是报编码问题,自己试了一下,也出问题了...当我们编辑了一个Java源文件保存时
- 实现文档在线预览的方式除了上篇文章《文档在线预览(一)通过将txt、word、pdf转成图片实现在线预览功能》说的将文档转成图片的实现方式外
- Android创建桌面的快捷方式 概述 :创建桌面快捷方式相当与创建一个程序的入口,就像我们程序在安装完毕后会自动创建一个图标到桌面。其实创
- 传输层安全性协议(英语:Transport Layer Security,缩写作 TLS),及其前身安全套接层(Secure Sockets
- 就我们所知道的,java中有子类和父类,子类由于继承父类而形成,那么父类还有没有父类呢?答案是有了,父类的父类就是object类,一切父类都
- 1、AndroidManifest.xml中将activity<activity &nb