有很多類似的問題集中在一個方面進行優化,但每個解決方案都有一個醜陋的缺點。最佳JAXB XJC代碼生成和最佳XML模式的繼承
假設我想開發一個XML模式(XSD),它允許下列文件,想用生成的類XJC:
<Catalogue>
<Book>...</Book>
<Journal>...</Journal>
<Book>...</Book>
...
</Catalogue>
架構應該模擬類型層次結構(Book
和Journal
是Publication
子)。當然,對於生成的Java類,這也應該是 。
我嘗試以下approches其中都有一個主要問題:
1)建模目錄包含所有可能的亞型的xsd:choice
。
<xsd:complexType name="Catalogue">
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="Book" />
<xsd:element ref="Magazine" />
</xsd:choice>
</xsd:complexType>
<xsd:element name="Publication" abstract="true" type="Publication" />
<xsd:element name="Book" type="Book"/>
<xsd:element name="Magazine" type="Magazine"/>
<xsd:complexType name="Publication">
<xsd:sequence></xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Book">
<xsd:complexContent>
<xsd:extension base="Publication">
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
...
這裏的問題是,我不得不提及這可能是很多在實際應用中choice
元素的所有可能的亞型。 一個小問題是,儘管Catalogue
屬性具有正確的類型List<Publication>
它有一個醜陋的名字bookAndMagazine
。 由於冗餘模式定義,不是一個選項!
2)建模目錄包含父類
<xsd:complexType name="Catalogue">
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="Publication" maxOccurs="unbounded"/>
</xsd:choice>
</xsd:complexType>
這不只是工作的xsd:sequence
如果XML文檔,制定像<Publication xsi:type="Book"...>
。因此,不是一種選擇!
3)使用substitutionGroup喜歡這裏http://www.xfront.com/ElementHierarchy.html
<xsd:complexType name="Catalogue">
<xsd:choice maxOccurs="unbounded">
<xsd:element ref="Publication" maxOccurs="unbounded"/>
</xsd:choice>
</xsd:complexType>
<xsd:element name="Publication" abstract="true" type="Publication" />
<xsd:element name="Book" type="Book" substitutionGroup="Publication"/>
<xsd:element name="Magazine" type="Magazine" substitutionGroup="Publication"/>
<xsd:complexType name="Publication">
<xsd:sequence></xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Book">
<xsd:complexContent>
<xsd:extension base="Publication">
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
...
這裏所提到的,代碼生成是問題,因爲的Catalogue
內部元件被映射到List<JaxbElement<? extends Publication>>
而非 List<Publication>
。因此,這也不是一種選擇。
如何把我所有的目標一起?:
- 規範的,非冗餘的架構該款車型繼承(如2)或3))
- 簡單幹淨從這個模式生成的Java類以及哪些模型繼承(如在2)部分在1))
- 清潔XML文檔(不像在2))標準JAXB和最好不要太大約束力元數據的
- 使用
如果沒有解決,所有這些目標,一會你喜歡它匹配?
你能詳細說明爲什麼選項3)不好,爲什麼'List>'不適合你?它實際上是優雅的:不僅你有一個JAXB對象,而且JAXBElement <>包裝器爲你提供完全限定的元素名稱。 xml info –
2012-04-13 05:23:30
1.)我想在其他應用程序部分使用生成的類層次結構作爲域模型的一種,我不想讓它們依賴於JaxB類型。 2)我正在應用XJC插件jaxb-visitor,它爲訪問者模式豐富了生成的類。 JaxbElement屬性打破了遍歷文檔樹的自然方式。 – rainer198 2012-04-13 07:40:35
我也覺得選項3非常難看。我更喜歡保持與pojo的接近,並且從來不需要JAXBElement在這種情況下提供的東西,因爲它全部是一個模式。 – 2012-05-12 13:28:06