我有以下代码来执行从一个JAXB注释对象到另一个JAXB注释对象的XSLT转换。在这种情况下,性能是否真的很差?它是否将JAXB对象编组为XML,将其转换为另一种XML并取消编组,或者是否有更好的技巧?
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource(mapping.getInputStream()));
JAXBResult result = new JAXBResult(JaxbUtils.getJAXBContext(CalypsoUploadDocument.class));
transformer.transform(new JAXBSource(JaxbUtils.getJAXBContext(CalypsoUploadDocument.class), uploadMessage),result);
return result.getResult();
答案 0 :(得分:2)
如果使用Java 6(我的生产经验基于Oracle JDK),这是我们也做过的有效方法。表现非常好。一个小的改进是使用模板实例。
另一方面,如果您的应用程序只有一个或几个转换,并且转换本身不会随时间变化,我不推荐这种方法。然后直接方法更快(java实例 - > java mapping - > java实例)
答案 1 :(得分:2)
这取决于XSLT处理器。 Saxon的商业版可以在流模式下进行一些转换。 JAXBSource
扩展SAXSource
,因此也适用于一系列事件。对于更复杂的转换或其他XSLT处理器,实现可能首先创建一个内部树状结构。这个结构通常比DOM树更优化并且性能更好,有关基准测试,请参阅Comparing DOM and other object models。最好自己对代码进行基准测试或分析,看看性能是否可以接受。
关于代码的一个注意事项,JAXBContext
的创建成本很高,应该在应用程序的生命周期内进行缓存。如果您的JaxbUtils
类尚未执行此操作,则重用上下文可以提高性能。
答案 2 :(得分:2)
注意:我是EclipseLink JAXB (MOXy)潜在客户和JAXB (JSR-222)专家组的成员。
替代方法
如果您碰巧使用MOXy作为JAXB提供程序,那么您可以使用单个Java模型映射到两个XML模式。您可以使用标准JAXB(JSR-222)注释映射到第一个,使用MOXy的外部映射文档映射到第二个。下面是我博客的链接,我使用这种方法将一个对象模型映射到Google和Yahoo天气服务的输出。