我想知道将java对象转换为xml的最佳或最广泛使用的api是什么。我对这个问题很新。是否有某种api调用你可以传入一个对象并返回xml?或者,您需要通过提取对象值来手动构建文档,这是否更加乏味?
我一直在阅读有关xerces,sax和jaxb的内容。我想继续这条开源路线。
谢谢!
答案 0 :(得分:54)
JAXB 绝对是 解决方案。
为什么呢?好吧,它在JDK 6中 ,所以你永远不会发现它没有维护。
它使用Java注释来声明类,方法和字段的XML相关属性。
注意: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)