我想知道将 java 对象转换为 xml 的最好或最广泛使用的 api 是什么。我对这个问题还很陌生。是否可以进行某种 api 调用来传递对象并返回 xml?或者,当您需要通过提取对象值来手动构建文档时,这会更加繁琐吗?
我一直在阅读有关 xerces、sax 和 jaxb 的内容。我想继续沿着这条开源路线走下去。
谢谢!
JAXB 绝对是解决方案。
为什么?嗯,它在 JDK 6 中,所以你永远不会发现它不受维护。
它使用Java注释来声明类、方法和字段的XML相关属性。
注意: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 注释来完成的。
您可能想查看 XStream:http://x-stream.github.io
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
)
对于任何决定使用 JAXB 的人,请确保缓存 JAXBContext。众所周知,JAXBContext.newInstance 非常昂贵。我记录了一个案例,其中在日志记录中使用了到 xml 的转换,并且 JAXBContext.newInstance 没有被缓存,当由 20 个并发用户调用时,它会导致性能开销高达 5 秒。
http://app-inf.blogspot.com/2012/10/performance-tuning-logging-right-way.html
这并不是为了阻止任何人使用 JAXB。一旦 JAXBContext 被缓存,性能就会非常好,如上面的链接所述。
XMLBeans 是另一种,类似于 JAXB。我已经有一段时间没有看过 JAXB 了,当我看过的时候,它与 XMLBeans 相比相当糟糕,但那是几年前的事了(我更喜欢使用 JDK 中的东西而不是第 3 方的东西,但我仍然使用XMLBeans 至今)。
这个领域有很多开源框架。然而,顾名思义,“简单”是迄今为止执行序列化最简单的方法。看看教程。另一个特性是它可以执行多态序列化,这意味着它不像 JAXB 那样受到限制。