什么是最好的方式来将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那样受到限制。