什么是最好的方式来将Java对象转换为XML与开放源码API

我想知道什么是最好的或最广泛使用的API是将Java对象转换为XML。 我在这个问题上是相当新的。 是否有某种API调用,你可以传递一个对象,并返回XML? 或者是更繁琐的地方,因为你需要通过提取对象值手动构build文档?

我一直在阅读关于xerces,sax和jaxb。 我想继续沿着这个开源的路线。

谢谢!

JAXB绝对解决scheme。

为什么? 那么,它在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 -annotation来完成的。

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

Java 6提供了一个将带注释的Java对象转换为XML的API。 以下代码显示如何将注释的对象转换为XMLstring

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

最后的Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller();

 //如果你想让结果更具人类可读性,就这样做。
 m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
 m.marshal(o,System.out); 

你可以通过添加模式validation来进一步扩展(注意非常慢,但对于debugging很有用)

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

最后的Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller();
最终的Schema schema = SchemaFactory.newInstance(
   “http://www.w3.org/2001/XMLSchema”).newSchema(
   。的getClass()的getResource( “/ META-INF / WSDL / schema.xsd”));
 m.setSchema(模式);
 m.marshal(o,System.out); 

如果Type是已定义的元素,则不需要对JAXBElement进行types转换。 (即有一个注解@XmlRootElement)

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

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

再见。

对于任何决定使用JAXB的人,请确保cachingJAXBContext。 已知JAXBContext.newInstance非常昂贵。 我logging了在日志中使用转换为xml的情况,并且JAXBContext.newInstance未被caching,由20个并发用户调用时,导致性能开销高达5秒。

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

这不是为了阻止任何人使用JAXB。 一旦JAXBContext被caching,性能就非常好,正如上面的链接所讨论的。

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

这个领域有许多开源框架。 不过,正如其名字所暗示的那样,是迄今为止执行序列化最简单的方法。 看看教程 。 另一个特点是它可以执行多态序列化,这意味着它不像JAXB那样受到限制。