2012-11-28 36 views
1

我有以下代碼執行從一個JAXB註釋對象到另一個JAXB註釋對象的XSLT轉換。在這種情況下,表現會很差嗎?它是否將JAXB對象編碼爲XML,將其轉換爲另一個XML並取消編排,還是有更好的技巧?JAXB和XSLT性能

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(); 

回答

2

如果使用Java 6(我的生產經驗基於Oracle JDK),這是我們也已經完成的有效方法。性能相當不錯。一個小改進就是使用一個Templates實例。

另一方面,如果您的應用程序有一個或幾個轉換,並且轉換本身不會隨時間而改變,我不建議使用這種方法。然後直接的方法要快得多(java實例 - > java映射 - > java實例)

+0

不是真的知道你的模板實例 –

+1

javax.xml.transform.Templates的意思。用於將XSLT文檔緩存爲內存中的Java對象。 – rmuller

+0

感謝您提供模板提示。實際上我有一個用例,我將一遍又一遍地使用我的模板。 –

2

這取決於XSLT處理器。 Saxon的商業版本可以在流模式下進行一些轉換。 JAXBSource延伸SAXSource,所以也適用於一系列事件。對於更復雜的轉換或其他XSLT處理器,實現可能會首先創建一個內部樹狀結構。此結構通常比DOM樹更優化並且性能更好,有關某些基準的信息,請參見Comparing DOM and other object models。最好自己對代碼進行基準測試或分析,看看性能是否可以接受。

關於您的代碼的一個注意事項,JAXBContext創建成本很高,應該在應用程序的整個生命週期內緩存。如果您的JaxbUtils類尚未執行此操作,則重用上下文可以提高性能。

+0

Yeap,的確,我的JaxbUtils類提供了JAXBContext緩存。我想知道我是否應該實施一些marshallers和unmarshallers集合,但他們不應該那麼昂貴 –

1

備註:我是EclipseLink JAXB (MOXy)的領導者和JAXB (JSR-222)專家組的成員。

替代方法

如果你碰巧使用的莫西爲您的JAXB提供者,那麼你可以有一個單一的Java模型,地圖既XML模式。您可以使用標準JAXB(JSR-222)註釋映射到第一個映射,使用MOXy的外部映射文檔映射到第二個映射。以下是我的博客鏈接,我使用這種方法將一個對象模型映射到Google和Yahoo天氣服務的輸出。