2012-03-13 75 views
8

問題: 如何讓xjc/Jaxb爲包含重複的elementdefinitions的幾個模式在相同的命名空間中生成propper javaclasses?使用JAXB編譯幾個包含同一元素的重複定義

信息: 我有三個.xsd模式:A,B和C.都具有相同的目標名空間。 他們都是給我的3種shemas,我不可能以任何方式改變它們。

它們A具有一些元件,其也於B或C中發現(但A具有許多自聲明的元素爲好) 實施例:這是相同的「代碼」爲A和C:

<xs:simpleType name="y_ym_ymdDatoType"> 
    <xs:union memberTypes="arcgYearType arcgYearMonthType arcDateType"/> 
</xs:simpleType> 
<xs:simpleType name="arcgYearType"> 
    <xs:restriction base="xs:gYear"> 
     <xs:minInclusive value="1700"/> 
     <xs:maxInclusive value="2100"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="arcgYearMonthType"> 
    <xs:restriction base="xs:gYearMonth"> 
     <xs:minInclusive value="1700-01"/> 
     <xs:maxInclusive value="2100-12"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="arcDateType"> 
    <xs:restriction base="xs:date"> 
     <xs:minInclusive value="1700-01-01"/> 
     <xs:maxInclusive value="2100-12-31"/> 
    </xs:restriction> 
</xs:simpleType> 

當使用XJC將它們彙編成javaclasses,我得到下面的異常:

[ERROR] 'y_ym_ymdDatoType' is already defined 
line 297 of file:../c.xsd 

[ERROR] (related to above error) the first definition appears here 
line 309 of file:../a.xsd 

和同樣發生在其他元素:arcgYearType,arcgYearMonthType和arcDateType。

我已閱讀關於可能可以解決這個問題的綁定文件,但我不知道如何做到這一點,所以示例將是高度優先的。

回答

0

您可以使用綁定文件手動解決衝突。這裏是例子,在那裏你可以爲衝突的名稱指定您的自定義名稱:

<bindings schemaLocation="../party.xsd" version="1.0" node="/xs:schema"> 
    <bindings node="//xs:complexType[@name='FixedIncomeBook']"> 
     <class name="PartyFixedIncomeBook"/> 
    </bindings> 
</bindings> 
+0

這是不是在它們出來時不會輕易地重命名XML元素,還是隻是重命名生成的javaclasses? – 2012-03-13 14:15:28

+0

它重命名生成的java類。默認情況下,你會得到'FixedIncomeBook.java',並且通過這個綁定你可以得到'PartyFixedIncomeBook.java' – 2012-03-13 14:21:11

+0

我得到:[ERROR]不受支持的綁定命名空間「」。也許你的意思是「http://java.sun.com/xml/ns/jaxb/xjc」?文件第4行:/../ C.xsd 第4行是模式定義: 你可以說出了什麼問題嗎? – 2012-03-13 15:05:10

2

從你的描述,我認爲是沒有包括XSD文件之間的關係。另外,我必須假設你正在嘗試重用類,其中內容重疊。

簡單的方法是獨立編譯每個文件,併爲每個XSD文件提供不同的Java包。這裏的問題是,如果你試圖將內容從一個XML「鏈接」到另一個XML(即,從A解組,然後從B解組),然後在com.A包中包含C1類,在包com.B中包含C1類,而匹配相同的XSD複雜類型,不是「可互換的」;你將不得不在它們之間進行轉換。您需要一個自定義綁定文件,或者如果您使用NetBeans,只需在JAXB嚮導中設置不同的包。

最好的方法可能是使用劇集(請參閱this on SO)。處理A.xsd,然後使用該插曲處理B.xsd等。

+0

1.不包含。 2.是的,我想重複使用,因爲它們是相同的,但這不是主要目標,所以如果做其他事情更容易,那就這樣做吧。 我對C.xsd中的A.xsd沒有興趣,我只是在同一個項目中使用它們。即使xsd來自同一TNS,是否有一種簡單的方法可以使軟件包延期? – 2012-03-13 14:17:02

+0

@Sofus,那麼你爲什麼不使用劇集?或者使用針對不同命名空間的自定義綁定針對每個包運行xjc? – 2012-03-13 15:48:14

+0

我會在20個小時左右試試,謝謝你 – 2012-03-13 16:37:03

相關問題