Java到XML的转换?
将Java到XML的转换?,java,xml,serialization,Java,Xml,Serialization,将Java对象转换为XML有哪些不同的方法,我知道其中一个选项是JAXB,但我想知道其他的方法/工具可用于相同的转换 注意:我没有进一步的要求,因此我无法在问题中添加更多的meat,但现在,如果我能了解到将Java转换为XML有哪些不同的方法,那就太好了 更新:不同的建议方法包括: 及 现在,在所有建议的方法中,将Java对象转换为XML和XML转换为Java对象的最佳方法是什么?您始终可以使用javax.XML.bind.Marshaller和javax.XML.bind.Unma
Java对象
转换为XML
有哪些不同的方法,我知道其中一个选项是JAXB
,但我想知道其他的方法/工具
可用于相同的转换
注意:我没有进一步的要求,因此我无法在问题中添加更多的meat
,但现在,如果我能了解到将Java转换为XML有哪些不同的方法,那就太好了
更新:不同的建议方法包括:
及
现在,在所有建议的方法中,将Java对象转换为XML
和XML转换为Java对象的最佳方法是什么?您始终可以使用javax.XML.bind.Marshaller
和javax.XML.bind.Unmarshaller
接口自己完成
这并不像听起来那么疯狂。这并不是很难做到,你将完全控制和了解所做的事情
我愿意承认,许多人更喜欢自动化方法。我的提议不受欢迎
我过去使用过XStream,并且很喜欢它,但是当我使用它时,我不必担心XML名称空间。我听说XStream不能很好地处理它们。JAXB是将Java对象转换为XML的标准和最佳方法。有几种可用的开源实现:
- (我是技术负责人)
- (参考实现,包含在JavaSE6中)
有关JAXB的更多信息,请查看我的博客:
更新:
最好的方法是什么?
这最终取决于您试图做什么,我将在下面解释:
用例#1-从XML模式开始
在这个用例中,您有一个XML模式,并且希望生成一个Java模型。本线程中提到的工具中没有多少支持此用例
提名人:
- JAXB(所有实现)-使用JAXB注释生成POJO
- XMLBeans—生成包含XML绑定逻辑的专有类
用例#2-从Java类开始(您可以编辑)
在这个用例中,您有更多的选择(只有XMLBeans被删除)。编辑通常包括添加注释以控制映射
提名人:
- 除了豆子,人人都喜欢
用例#3-从Java类开始(您不能编辑)
在本用例中,您没有修改模型类的源。这要求元数据在外部以XML文件的形式(按代码)提供
提名人:
- EclipseLink JAXB(MOXy)-提供了一种新的元数据,可以通过编程应用元数据
- Metro JAXB-可以利用Annox或JAXB导入
- Castor-提供外部绑定文件
- JiBX-提供一个外部绑定文件
- XStream-元数据可以通过编程方式应用
用例#4-中间相遇(现有类和模式)
在本用例中,您有需要映射到现有XML模式的现有类。EclipseLink MOXy及其应用程序是我所知道的唯一能够处理此用例的工具
提名人:
- 日食JAXB(MOXy)
用例5-XML信息集保存:
在这个用例中,您需要保留未映射的内容:注释、处理说明等
提名人:
- JAXB(所有实现)-具有该特性李>
- XMLBeans—生成的对象模型存储整个XML信息集
用例#6-与JPA的兼容性
JPA是Java持久化的Java标准。JPA有许多概念:组合键、双向关系、延迟加载等,这些概念很难与XML绑定解决方案一起使用。例如,任何仅通过字段与对象交互的XML工具通常都会遇到延迟加载属性的问题
提名人:
- EclipseLink JAXB(MOXy)-是
用例#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
- 吉布斯
需要考虑的其他事项
- 该工具是否仍在开发/支持中?听起来很有趣,但我见过有人推荐5年没更新过的工具。这里提到的一些工具已经两年没有发布了
我选择的最佳方法?-JAXB
综上所述,JAXB可能并不总是最适合某个特定用例(但它总是非常适合),但它是唯一可以用于所有用例的库。这意味着它总能完成任务。另一种方法是为不同的任务使用不同的库,这样可以提供多个