Java XML绑定

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

澄清:我不仅希望看到您使用的框架,而且还希望看到使用其中一个框架的原因。

JiBX 。 以前我使用过Castor XML ,但是JiBX被certificate要明显更好,特别是在性能方面(从Castor XML到JiBX的一些应用程序代码的直接端口使它快9倍)。 我还发现JiBX的映射格式比Castor更优雅。

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

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

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

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

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

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

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

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

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

我们使用xstream 。 编组/解编是微不足道的。 查看他们的教程中的示例。

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

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

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

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

我从未使用它,但是我有一个即将推出的项目,需要这样一个框架,我将有兴趣知道其他人如何与上述交易。

我在7年前使用了蓖麻 – 它运作得相当好。 使用DTD。 当时没有多少选择。

在目前的项目中,我已经习惯了
1)JAXB – 基于标准,可用的参考实现,命令行和ant工具。 最新版本 – 2.1.8需要java 5+。
2)XStream – 用于Soap unmarshalling – 需要Java 5+。 不像JAXB最新的那样快速和标准兼容。

BR,
〜一

相关: Java中的XML序列化?

XmlBeans是一个不错的选择,特别是如果你有’破坏’的XSD / WSDL文件。

唐提到

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

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

没有与命名空间的斗争,遍历你想要解组的对象,以及Factory.parse它。

希望我2周前找到它。

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

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