Java到XML的转换?

有什么不同的方法将Java Objects转换为XML ,我知道一个选项是JAXB但是想知道同样可用的其他approaches/tools是什么?

注意:我没有进一步的要求,因此我无法在问题中添加更多内容,但是在这个时候,如果我能够了解将Java to XML转换Java to XML有哪些不同的方法,那将会非常棒?

更新:不同的建议方法是:

  1. javax.xml.bind.Marshaller和javax.xml.bind.Unmarshaller
  2. XStream的
  3. 的XMLBean
  4. JAXB
  5. 蓖麻
  6. JIBX
  7. Apache Digester

现在,在所有建议的方法中,将Java Objects to XML转换Java Objects to XMLXML to Java Objects最佳方法是什么?

JAXB是将Java对象转换为XML的标准和最佳方法。 有几种开源实现可用:

  • EclipseLink MOXy (我是技术主管)
  • Metro (参考实现,包含在Java SE 6中)
  • JaxMe

有关JAXB的更多信息,请查看我的博客:

更新:

什么是最好的方法?

这最终取决于你想要做什么,我将在下面解释:

用例#1 – 从XML模式开始

在此用例中,您具有XML模式,并且您希望生成Java模型。 此线程中提到的工具中没有多少支持此用例。 例如,XStream为此推荐了XMLBeans 。

提名人:

  • JAXB(所有实现) – 使用JAXB注释生成POJO。
  • XMLBeans – 生成包含XML绑定逻辑的专有类。

用例#2 – 从Java类开始(可以编辑)

在这个用例中,您有更多选择(仅消除了XMLBeans)。 编辑通常涉及添加注释来控制映射。

提名人:

  • 除XMLBeans之外的所有人

用例#3 – 从Java类开始(无法编辑)

在此用例中,您没有源来修改模型类。 这要求外部提供元数据,或者使用代码的XML文件。

提名人:

  • EclipseLink JAXB(MOXy) – 提供外部绑定文件 ,可以通过编程方式应用元数据。
  • Metro JAXB – 可以利用Annox或JAXBIntroductions
  • Castor – 提供外部绑定文件
  • JiBX – 提供外部绑定文件
  • XStream – 可以通过编程方式应用元数据

用例#4 – 中间相遇(现有类和模式)

在此用例中,您需要映射到现有XML架构的现有类。 EclipseLink MOXy及其基于XPath的映射是我能够处理这个用例的唯一工具

提名人:

  • EclipseLink JAXB(MOXy)

用例#5 – XML Infoset保存:

在此用例中,您需要保留未映射的内容:注释,处理指令等。

提名人:

  • JAXB(所有实现) – 具有Binderfunction。
  • XMLBeans – 生成的对象模型存储整个XML信息集。

用例#6 – 与JPA的兼容性

JPA是Java持久性的Java标准。 JPA有许多概念:复合键,双向关系,延迟加载等,这些都很难与XML绑定解决方案一起使用。 例如,任何只通过字段与对象交互的XML工具通常都会出现延迟加载属性的问题。

提名人:

  • EclipseLink JAXB(MOXy) – 在构建时考虑了JPA 。

用例#7 – 与XML Web服务的兼容性(JAX-WS)

JAXB是JAX-WS的默认绑定层。

提名人:

  • JAXB(实现依赖于JAX-WS提供者)

用例#8 – 与RESTful Web服务的兼容性(JAX-RS)

JAX-RS是基于HTTP协议的JAX-WS的轻量级替代品。 请查看以下示例 。

提名人:

  • JAXB(所有实现) – 默认绑定层,最容易与JAX-RS一起使用。
  • 其他所有 – 您可以利用MessageBodyReader / Writer的概念来使用其他XML工具。

用例#9 – 与Spring的兼容性

Spring有一些内置支持与XML绑定工具集成,请查看以下链接以获取更多信息:

提名人:

  • JAXB(所有实现)
  • 蓖麻
  • XMLBeans的
  • 的JiBX

其他要考虑的事情

  • 该工具是否仍在开发/支持中? 听起来很有趣,我看到人们推荐的工具在5年内没有更新。 这里提到的一些工具在2年内没有发布。

我挑选最好的方法? – JAXB

看看上面的类别,JAXB可能并不总是最适合特定用例(但它总是很合适),但它是唯一可用于所有用例的库。 这意味着它总能完成这项工作。 另一种方法是为不同的任务使用不同的库,为您提供多个库支持。

我确实领导了一个JAXB实现EclipseLink MOXy,但MOXy开始作为专有的XML绑定库TopLink OXM。 TopLink始终了解标准的好处(即EJB / JPA),并且我们实现了JAXB 1.然后我们(我是代表性的)成为JAXB 2(JSR-222)上的活跃成员。

您始终可以使用javax.xml.bind.Marshallerjavax.xml.bind.Unmarshaller接口javax.xml.bind.Unmarshaller

这并不像听起来那么疯狂。 这并不难,你可以完全掌控并完成所做的事情。

我愿意承认很多人更喜欢自动化方法。 我的产品不会受欢迎。

我过去使用过XStream并喜欢它,但是当我使用它时,我不必担心XML命名空间。 我被告知XStream没有很好地处理它们。

一些替代方案包括: –

  • XStream的
  • 的XMLBean

但是,与JAXB一起使用的一个显着优点是它带有Java distrubtion。

我知道这不是你问的,但是你考虑过JSON而不是XML吗? 我目前正在开发一个大量使用JSON(使用Jackson库)的项目,我对此非常满意。 jackson的工作方式与JAXB类似 – 它甚至可以与JAXB注释一起使用,以防你想要同时使用它们。

XMLBeans也值得一看。

简单的XML序列化(simpleframework.org)

另一种方法是Simple,它比JAXB,JiBX或其他类似工具更容易使用。 您只需注释类,就可以将任何POJO序列化为XML。 此外,它可能是目前适用于所有已知Java平台的唯一框架,包括Android,Google App Engine,任何JDK 1.5+。 有关更多信息,请查看教程

还有:

  • java.beans.XMLEncoder / -Decoder
  • javax.xml.stream.XMLStreamWriter

但是如果你没有充分的理由去做,我建议使用JAXB。

你也可以看看蓖麻和jibx 。

Apache Digester是一个选项。这是一个教程 。如果JSON格式是可以接受的,那么你可以使用google-gson 。

Castor允许直接从XSD模式生成Java类(体面实现)(上面的用例#1)。 请确保,在Android 2.1中,不要使用默认的android SAXParser。 你会得到命名空间错误。 您可以通过在core.properties中将解析器定义为例如Xerces(以及您添加所需的JARS)来实现此目的。 在android 2.2中它可能没问题。 请注意,如果使用xerces为unmarsheler创建xmlcontext,它仍然无法工作,因为映射本身将使用android的SAX进行解析。 它必须在核心(顶级属性文件)上完成,以便即使映射也由xerces解析。 终于 – 性能和你期望的一样慢…… :(祝你好运SM