使用开源api将java对象转换为xml的最佳方法是什么[已关闭]

问题描述 投票:0回答:6

我想知道将 java 对象转换为 xml 的最好或最广泛使用的 api 是什么。我对这个问题还很陌生。是否可以进行某种 api 调用来传递对象并返回 xml?或者,当您需要通过提取对象值来手动构建文档时,这会更加繁琐吗?

我一直在阅读有关 xerces、sax 和 jaxb 的内容。我想继续沿着这条开源路线走下去。

谢谢!

java xml serialization
6个回答
55
投票

JAXB 绝对是解决方案。

为什么?嗯,它在 JDK 6 中,所以你永远不会发现它不受维护。

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

教程1

教程2

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

JAXB 的另一个伟大之处是:它受到其他 Java 相关的支持 技术,例如 JAX-RS(Java RESTful API,可用于 作为 Java EE 6 的一部分)。 JAX-RS 可以服务和接收 JAXB 对象动态,无需编组/解组它们。 您可能想查看 Netbeans,其中包含 对 JAX-RS 的开箱即用支持。请阅读本教程以开始使用。

编辑:

编组/解组“随机”(或外部)Java 对象,JAXB 提供了相当简单的可能性:可以声明一个 XmlAdapter 并将现有 Java 类“包装”为 JAXB 兼容。 此类 XmlAdapter 的使用是通过使用 @XmlJavaTypeAdapter 注释来完成的。


19
投票

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


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);</pre>

如果

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


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 被缓存,性能就会非常好,如上面的链接所述。


1
投票

XMLBeans 是另一种,类似于 JAXB。我已经有一段时间没有看过 JAXB 了,当我看过的时候,它与 XMLBeans 相比相当糟糕,但那是几年前的事了(我更喜欢使用 JDK 中的东西而不是第 3 方的东西,但我仍然使用XMLBeans 至今)。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.