热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

spring使用OXM进行对象XML映射解析

这篇文章主要介绍了spring使用OXM进行对象XML映射解析,具有一定借鉴价值,需要的朋友可以参考下

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映射解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Echarts图表重复加载、axis重复多次请求问题解决记录
    文章目录1.需求描述2.问题描述正常状态:问题状态:3.解决方法1.需求描述使用Echats实现了一个中国地图:通过选择查询周期&#x ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • python限制递归次数(python最大公约数递归)
    本文目录一览:1、python为什么要进行递归限制 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
author-avatar
哟哟哈哈呼呼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有