2010-03-20 88 views
8

我有一個現有的數據模型。我想用XML來表達這個數據模型。JAXB - 將XSD或XSD豆類化爲豆?

它看起來像我有兩個選擇,如果我使用JAXB:

  • 建立鏡像我的數據模型的XSD,並使用XJC創建綁定對象。編組和解組將涉及創建一個「映射」類,該類將採用我現有的數據對象並將它們映射到xjc創建的對象。例如,在我的數據模型中,我有一個Doc類,JAXB將創建另一個具有基本相同字段的Doc類,並且必須將我的Doc類映射到xjc的Doc類。
  • 使用JAXB註釋標註我現有的數據模型,並使用schemagen從註釋類生成XSD。

我可以看到兩種方法的優點和缺點。似乎大多數使用JAXB的人都是從XSD文件開始的。 XSD應該是黃金標準的真理是有道理的,因爲它以真正的跨平臺方式表達了數據模型。

我傾向於先從XSD開始,但似乎很奇怪,我必須編寫和維護一個單獨的映射類,以便在我的世界和JAXB世界之間穿梭數據。

有什麼建議嗎?

回答

6

從現有類生成的XSD聽起來像是最安全的方式。

不過認爲除非你知道JAXB,否則註釋你自己的類的方法可能會變得非常令人沮喪(在痛苦和時間:))。

當我嘗試從JAXB生成的類中手動提取超類,然後將實例編組爲XML時,發生在相關上下文中的這種情況。我遇到了各種(神祕的)JAXB異常。誠然,我的JAXB知識還沒有那麼深。

如果你堅持使用JAXB,那麼我建議考慮使用第一種方法(XSD + XJC)作爲獲取類的初始JAXB註釋的方法。

您可以使用XSD + XJC瞭解如何註釋自己的類。然後,您可以嘗試將正確的註釋貼到它們上面。先從更復雜的類(引用,繼承,引用列表,抽象基類的引用列表)開始。

使用其他技術從未註釋的類生成XSD作爲XSD上的kick start可能會有幫助。或者你可以選擇一個涵蓋大部分類的使用的XSD。

如果這項工作的目的是爲了能夠將實例編組爲XML,那麼我建議關注JAXBElement。在某些情況下(由於缺乏知識我不能指出)實例不會編組,除非它們被包裝在JAXBElement中。

我們使用HyperJAXB生成基於一組XSD的持久層。生成的類也用於編組。我們有充足的「樂趣」使得這個工作尤其重要。因爲IDREF和JAXBElement。

1

您可以使用xjc,並且仍然只有一個具有將作爲數據對象服務的XML註釋的類。但是,如果你沒有重新生成每個構建的類,那就是這種情況。

而在我看來,代碼生成的問題是從哪裏開始,我建議從類開始。因爲如果你有類作爲起點,你將永遠不需要重新生成這些類。隨着時間的推移,你的課程開始增長 - 包括@XmlTransient,繼承,輔助方法和其他(JPA)註釋。

1

你幾乎處於JAXB最糟糕的起點。在你的位置上,我認爲JiBX可能是一個更好的選擇,它可以從未註釋的類模型生成模式,然後在運行時將XML綁定回對象模型,而不使用註釋。

+0

JAXB 2在設計時考慮到了這種情況。如果你想表達沒有註釋的映射,你可以使用EclipseLink MOXy等JAXB實現。 – 2010-07-09 14:03:45

1

我們已經使用的解決方案是擁有一個單獨的項目,該項目包含由使用JAXB從中派生java類的xml模式定義的所有數據模型。其他使用數據模型的項目依賴於這個模式包。

通過這種方式,項目之間的所有「契約」都在一個地方定義,使用漂亮的便攜式xsd表示法。不需要任何映射類,因爲我們直接使用JAXB生成的類。

2

字裏行間,我認爲符合下列條件:

  1. 你有你想要的對象模型。
  2. 您有所需的XML模式,或者至少有一個相當不錯的想法,您希望它看起來如何。

這種情況通常被稱爲「滿足中間」映射。它只是部分由JAXB解決。幸運的是,由於JAXB是一個規範,所以還可以使用其他實現,例如EclipseLink JAXB(MOXy)。

莫西提供了一個基於XPath映射擴展,它可以讓你對你有你想要的Java模型和XML模式之間的映射: