Java到XML的转换?

Rac*_*hel 27 java xml serialization

什么是转换不同的方法Java ObjectsXML,我知道有一个选项JAXB,但想知道是什么其他approaches/tools可用于相同?

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

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

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

现在所有的建议方案中什么是最好的去转换方法Java Objects to XMLXML to Java Objects

bdo*_*han 32

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

有关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(所有实现) - 具有Binder功能.
  • XMLBeans - 生成的对象模型存储整个XML信息集.

用例#6 - 与JPA的兼容性

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

提名人:

用例#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)上的活动成员.

  • Blaise是JAXB团队的领导者,所以也许他不是最客观的意见. (3认同)

duf*_*ymo 10

您可以随时使用javax.xml.bind.Marshallerjavax.xml.bind.Unmarshaller接口来完成.

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

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

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

  • +1来反击盲目的downvote. (2认同)