使用开源apis将java对象转换为xml的最佳方法是什么?

时间:2009-04-10 00:25:53

标签: java xml serialization

我想知道将java对象转换为xml的最佳或最广泛使用的api是什么。我对这个问题很新。是否有某种api调用你可以传入一个对象并返回xml?或者,您需要通过提取对象值来手动构建文档,这是否更加乏味?

我一直在阅读有关xerces,sax和jaxb的内容。我想继续这条开源路线。

谢谢!

7 个答案:

答案 0 :(得分:54)

JAXB 绝对是 解决方案。

为什么呢?好吧,它在JDK 6中 ,所以你永远不会发现它没有维护。

它使用Java注释来声明类,方法和字段的XML相关属性。

Tutorial 1

Tutorial 2

注意:JAXB还使您能够轻松地“解组”XML数据 (之前已经从Java对象实例编组)返回 对象实例。

JAXB的另一个好处是:它受到其他Java相关的支持 技术,例如 JAX-RS (Java RESTful API,可用) 作为 Java EE 6 的一部分。 JAX-RS可以服务和接收JAXB 对象即时,无需编组/解组它们。 您可能需要查看包含的Netbeans 对JAX-RS的开箱即用支持。开始阅读this tutorial

修改

对“随机”(或外来)Java对象进行编组/解组,JAXB 提供了相当简单的可能性:可以声明 XmlAdapter 并'包装'现有的Java类与JAXB兼容。 使用 @XmlJavaTypeAdapter -annotation来完成此类XmlAdapter的使用。

答案 1 :(得分:18)

您可能想要查看XStream:http://x-stream.github.io

答案 2 :(得分:4)

Java 6提供了一个API,用于将带注释的Java对象转换为XML。以下代码显示如何将带​​注释的对象转换为XML字符串

final JAXBElement<Type> o = new ObjectFactory().createElement(new Type());

final Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller();

// Do this if you want the result to be more human readable.
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(o, System.out);

您可以通过添加架构验证来进一步扩展它(注意非常慢,但对调试很有用)

final JAXBElement<Type> o = new ObjectFactory().createElement(new Type());

final Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller();
final Schema schema = SchemaFactory.newInstance(
  "http://www.w3.org/2001/XMLSchema").newSchema(
  getClass().getResource("/META-INF/wsdl/schema.xsd"));
m.setSchema(schema);
m.marshal(o, System.out);

如果Type是已定义的元素,则无需对JAXBElement进行类型转换。 (即有一个注释@XmlRootElement)

答案 3 :(得分:3)

java.beans.XMLEncoder和java.beans.XMLDecoder怎么样?

http://www.rgagnon.com/javadetails/java-0470.html

的示例

再见。

答案 4 :(得分:3)

对于决定使用JAXB的任何人,请确保缓存JAXBContext。众所周知,JAXBContext.newInstance非常昂贵。我记录了一个在日志记录中使用转换为xml并且没有缓存JAXBContext.newInstance的情况,当由20个并发用户调用时,它导致性能开销高达5秒。

http://app-inf.blogspot.com/2012/10/performance-tuning-logging-right-way.html

这不是为了阻止任何使用JAXB的人。缓存JAXBContext后,性能非常出色,如上面的链接所述。

答案 5 :(得分:1)

XMLBeans是另一个,类似于JAXB。我有一段时间没有看过JAXB,当我这样做时相比XMLBeans相当糟糕,但那是几年前(我更喜欢使用JDK中的东西而不是第三方的东西,但我仍然使用XMLBeans到今天。)

答案 6 :(得分:1)

这个领域有很多开源框架。但是,顾名思义,Simple是迄今为止执行序列化的最简单方法。看看Tutorial。另一个特性是它可以执行多态序列化,这意味着它不像JAXB那样受限制。