112

这里有人发誓 JAXB 是自切片面包以来最伟大的东西。我很想知道 Stack Overflow 用户认为 JAXB 的用例是什么,以及是什么使它成为该案例的好或坏解决方案。

4

9 回答 9

104

我是处理 XML 的 JAXB 的忠实粉丝。基本上,它为这个问题提供了一个解决方案(我假设熟悉 XML、Java 数据结构和 XML 模式):

使用 XML 很困难。需要一种方法来获取 XML 文件(基本上是文本文件)并将其转换为某种数据结构,然后您的程序可以对其进行操作。

JAXB 将采用您编写的 XML 模式并创建一组与该模式相对应的类。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 有助于处理它。

于 2009-03-03T17:09:14.093 回答
23

这是不使用它的一个原因:性能受到影响。编组和解组时有很多开销。您可能还想考虑另一个用于 XML-Object 绑定的 API——例如 JiBX:http: //jibx.sourceforge.net/

于 2009-03-03T17:50:08.690 回答
21

我一直在工作中使用 JAXB,我真的很喜欢它。它非常适合不断变化的复杂 XML 模式,尤其适用于随机访问 XML 文件中的标签。

我讨厌拉皮条,但我刚开始写博客,这实际上是我发布的第一件事!

在这里查看:

http://arthur.gonigberg.com/2010/04/21/getting-started-with-jaxb/

于 2010-04-21T21:54:04.937 回答
19

这是一个“XML 的 ORM”。最常与 JAX-WS 一起使用(实际上 Sun 实现是一起开发的),用于 WS Death Star 系统。

于 2009-03-03T16:39:23.650 回答
9

使用 JAXB,您可以自动创建对象的 XML 表示(编组)和 XML 的对象表示(解组)。

就 XML Schema 而言,您有两种选择:

  • 从 XSD 生成 Java 类
  • 从 Java 类生成 XSD

还有一些更简单的 XML 序列化库,如XStreamDigesterXMLBeans可能是替代品。

于 2009-03-03T17:04:42.200 回答
8

xsd如果您必须对一些定义为 XML 模式 ( )的外部 XML 规范进行编码,那么 JAXB 非常棒。

例如,您有一个交易应用程序,您必须向Uber Lame Trade Reporting 应用程序报告交易,他们已经让您ultra.xsd继续进行下去。使用$JAVA_HOME/bin/xjc编译器将 XML 转换为一堆 Java 类(例如UltraTrade)。

然后,您可以编写一个简单的适配器层来将您的交易对象转换为UltraTrades并使用将JAXB数据编组到 Ultra-Corp。将您的交易转换为 XML 格式更容易。

当 Ultra-Corp 没有真正遵守他们自己的规范时,一切都崩溃了price,他们以 a表示的交易xsd:float实际上应该表示为double

于 2009-03-03T22:36:37.037 回答
7

为什么我们需要 JAXB? Web 服务的远程组件(用 Java 编写)使用 XML 作为相互交换消息的手段。为什么选择 XML?因为 XML 被认为是在资源有限的网络上交换消息的轻量级选项。所以我们经常需要将这些 XML 文档转换为对象,反之亦然。例如:简单的 Java POJO Employee 可用于将 Employee 数据发送到远程组件(也是一个 Java 程序)。

class Employee{
 String name;
 String dept;
 ....
}

这个 Pojo 应该被转换(Marshall)为 XML 文档,如下所示:

<Employee>
  <Name>...</Name>
  <Department>...</Department>
</Employee>

而在远程组件,从 XML 文档(Un-Marshall)返回 Java 对象。

什么是 JAXB?

JAXB 是执行 Marshalling 和 UnMarshalling 操作的库或工具。它使您免于头痛,就这么简单。

于 2016-07-19T18:40:49.847 回答
4

您也可以查看 JIBX。它也是一个非常好的xml数据绑定器,它也是OTA(Open Travel Alliance)专业的,并且得到了AXIS2服务器的支持。如果您正在寻找性能和兼容性,可以查看:

http://jibx.sourceforge.net/index.html

于 2011-07-18T09:05:58.140 回答
0

JAXB 通过默认编组优化提供改进的性能。JAXB 定义了一个程序员 API,用于从 XML 文档读取和写入 Java 对象,从而简化了通过 Java 读取和写入 XML。

于 2014-11-24T22:11:46.753 回答