有人在这里发誓JAXB是切片面包以来最棒的东西.我很想知道Stack Overflow用户认为JAXB的用例是什么,以及是什么使它成为一个好的或坏的解决方案.
我是操作XML的JAXB的忠实粉丝.基本上,它提供了解决此问题的方法(我假设您熟悉XML,Java数据结构和XML模式):
使用XML很困难.人们需要一种方法来获取XML文件 - 基本上是一个文本文件 - 并将其转换为某种数据结构,然后程序可以操作.
JAXB将采用您编写的XML Schema并创建一组与该模式对应的类.JAXB实用程序将创建用于操作该XML的数据结构层次结构.
然后可以使用JAXB读取XML文件,然后创建生成的类的实例 - 包含XML中的数据.JAXB也反过来:接受java类,并生成相应的XML.
我喜欢JAXB,因为它易于使用,并且附带Java 1.6(如果你使用1.5,你可以下载JAXB .jars.)它创建类层次结构的方式很直观,而且根据我的经验,它做得不错抽象出"XML",以便我可以专注于"数据".
所以回答你的问题:我希望,对于小型XML文件,JAXB可能有点过分.它要求您创建和维护XML模式,并使用"标准教科书方法"将Java类用于数据结构.(主类,表示"节点"的小内部类,以及它们的巨大层次结构.)因此,对于应用程序的"首选项"的简单线性列表,JAXB可能不那么好.
但是如果你有一个相当复杂的XML模式,并且其中包含大量数据,那么JAXB就太棒了.在我的项目中,我在二进制(由C程序使用)和XML(以便人类可以使用和修改该数据)之间转换大量数据.生成的XML Schema非常重要(层次结构的层次很多,某些字段可以重复,其他字段不能重复),因此JAXB有助于操作它.
这是不使用它的原因:性能受损.编组和解编时会产生大量开销.您可能还想考虑另一个用于XML-Object绑定的API - 例如JiBX:http: //jibx.sourceforge.net/
它是"XML的ORM".最常用于WS Death Star系统的JAX-WS(实际上Sun实现是一起开发的).
我一直在工作中使用JAXB,我真的很喜欢它.它非常适合复杂的XML模式,这些模式总是在变化,尤其适用于XML文件中标记的随机访问.
我讨厌皮条客,但我刚开始写博客,这是我发布的第一件事!
看看这里:
http://arthur.gonigberg.com/2010/04/21/getting-started-with-jaxb/
使用JAXB,您可以自动创建对象的XML表示(编组)和XML的对象表示(解组).
就XML Schema而言,您有两种选择:
从XSD生成Java类
从Java类生成XSD
还有一些更简单的XML序列化库,如XStream,Digester或XMLBeans,可能是替代品.
如果必须编写一些定义为XML模式(xsd
)的外部XML规范,JAXB就很棒.
例如,您有一个交易应用程序,您必须向Uber Lame交易报告应用程序报告交易,他们已经让您ultra.xsd
继续使用.使用$JAVA_HOME/bin/xjc
编译器将XML转换为一堆Java类(例如UltraTrade
).
然后你可以编写一个简单的适配器层来转换你的交易对象,UltraTrades
并使用它JAXB
来整理数据到Ultra-Corp.很多比搞乱转换您的交易到他们的XML格式更容易.
一切都崩溃的地方是Ultra-Corp实际上没有遵守他们自己的规范,而price
他们作为a 的交易xsd:float
实际上应该表达为double
!
为什么我们需要JAXB? Web服务的远程组件(用Java编写)使用XML作为彼此之间交换消息的手段.为何选择XML?因为XML被认为是在资源有限的网络上交换消息的轻量级选项.因此,我们经常需要将这些XML文档转换为对象,反之亦然.例如:简单的Java POJO Employee可用于将Employee数据发送到远程组件(也是Java程序).
class Employee{ String name; String dept; .... }
这个Pojo应该转换(Marshall)到XML文档中,如下所示:
... ...
在远程组件中,从XML文档(Un-Marshall)返回Java对象.
什么是JAXB?
JAXB是执行编组和UnMarshalling操作的库或工具.它让你免于这种头痛,就这么简单.