20

您使用什么将 XML 绑定到 Java?JAXB、Castor 和 XMLBeans 是一些可用的选择。我看到的比较都是三四年前的。我愿意接受其他建议。编组/解编组性能和易用性特别令人感兴趣。

澄清:我不仅想看看你使用什么框架,还想看看你使用其中一个框架而不是其他框架的理由。

4

11 回答 11

13

如果您想做出明智的决定,您需要清楚为什么要在 XML 和 java 对象之间进行转换。原因是这个领域的不同技术试图解决不同的问题。不同的工具分为两类:

  1. XML 数据绑定 - 指将 XML 文档中的信息表示为计算机内存中的对象的过程。通常,这意味着定义 XSD 并生成等效的 java 源代码。不同语言之间的互操作是重中之重(因此使用了 XSD)——最常见的是用于实现基于 SOAP 的 Web 服务。
  2. XML 序列化 - 是指将内存中对象的图形写入流,以便它可以在某处或其他时间重构。你手动编写java类;xml 表示是次要的。此外,对性能的需求通常更大,而与其他语言(如 .net)的互操作需求通常较低。

对于 xml 序列化,Xstream 很难被击败。JAXB 是 XML 绑定的标准。

在任何一种情况下,如果您使用的是 J2EE,则需要特别注意从 JPA 检索到的类,因为类代理和持久性特定的集合类型可能会混淆绑定/序列化工具。

于 2008-10-15T20:08:59.570 回答
8

宝 以前我使用Castor XML,但 JiBX 被证明要好得多,尤其是在性能方面(将一些应用程序代码从 Castor XML 直接移植到 JiBX 使其速度提高了 9 倍)。我还发现 JiBX 的映射格式比 Castor 的更优雅。

JiBX 通过使用编译后字节码操作而不是 Castor 采用的反射方法来实现其性能。这样做的好处是它对编写映射类的方式要求较少。不需要 getter、setter 和无参数构造函数来满足这些工具。大多数时候,您可以在不考虑映射问题的情况下编写类,然后在不修改的情况下对其进行映射。

于 2008-10-15T19:47:20.690 回答
4

如果您有 XML 的 XSD,并且不需要将数据绑定到现有的一组类,那么我真的很喜欢XMLBeans。基本上,它是这样工作的:

  • 编译 XSD
  • 使用生成的 java 类来读取/写入符合此模式的文档

将 XML 文档绑定到生成的类非常简单:

EmployeesDocument empDoc = EmployeesDocument.Factory.parse(xmlFile); 
于 2008-10-15T20:15:10.650 回答
3

我们使用xstream。编组/解组是微不足道的。有关示例,请参阅他们的教程

于 2008-10-15T18:10:36.953 回答
2

Jibx是这里使用的。它非常快,但绑定可能有点棘手。但是,如果您有描述域对象的 XML 模式,它会特别有用,因为它确实可以很好地映射到 XSD(甚至还有一个 beta 工具 XSD2Jibx,它可以获取 XSD 并创建存根域类和映射,然后您可以获取并哄骗适合您现有的域模型)。

它操作字节码,因此它必须在 Java .class 文件的初始编译之后运行。您可以使用 Maven 插件,或者直接使用它(Eclipse 插件似乎对我不起作用)。

于 2008-10-15T18:28:31.927 回答
2

我使用 Jaxb 取得了不同程度的成功。当时(几年前)整体文档乏善可陈,基本使用文档(包括从哪里下载实现)很难找到或变化。

编写 Java 类的解析器非常好,与原始 XSD 几乎没有差异(尽管我认为它在支持抽象 XML 元素方面存在问题)。

从那以后我就没有使用过它,但是我有一个即将进行的项目,它只需要这样一个框架,我很想知道其他人如何看待上述内容。

于 2008-10-15T18:45:03.797 回答
1

我在 7 年前用过蓖麻——效果很好。使用 DTD。那个时候选择不多。

在当前的项目中,我使用了
1) JAXB——基于标准、可用的参考实现、可用的命令行和 ant 工具。最新版本 - 2.1.8 需要 java 5+。
2) XStream——用于 Soap 解组——需要 Java 5+。不像最新的 JAXB 那样快速且符合标准。

BR,
~A

于 2008-10-15T19:40:22.373 回答
1

相关:Java 中的 XML 序列化?

于 2008-10-15T23:39:45.120 回答
1

XmlBeans 是一个不错的选择,尤其是当您有“损坏的”XSD/WSDL 文件时。

唐提到

EmployeesDocument empDoc = EmployeesDocument.Factory.parse(xmlFile);

..但它也可以采用节点、文件或几乎任何来源。

无需与命名空间打架,遍历您要解组的对象,然后 Factory.parse 它。

希望我在 2 周前找到它。

于 2008-10-28T21:27:20.833 回答
0

我们使用蓖麻。它非常适合我们的需求。

于 2008-10-15T17:59:22.733 回答
0

我想知道完全相同的问题,最后我找到了 IBM 进行的性能测试。http://www.ibm.com/developerworks/library/x-databdopt2/。我猜JiBX是我的选择,呵呵。

于 2009-02-25T00:37:01.503 回答