2012-02-29 51 views
2

我正在使用JAX-b從XSD模式生成類(由多個文件複合,我不知道這是否是問題),結果不是什麼我期待創建的對象不會爲單個屬性提供獲取者,但它們爲屬性列表提供getter,如對象,我必須手動投射每個對象。JAX-B類從多個文件的模式複合生成

即 文件lom.xsd有:

<xs:include schemaLocation="common/elementTypes.xsd"/> 
    <xs:include schemaLocation="common/rootElement.xsd"/> 
文件中

elementTypes.xsd我們:

<xs:complexType name="lom"> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:group ref="general"/> 
     <xs:group ref="lifeCycle"/> 
     </xs:choice> 
     </xs:complexType> 

而不是在rootElement.xsd我們

 <xs:element name="lom" type="lom"> 
     <xs:unique name="lomUnique"> 
     <xs:selector xpath="*"/> 
     <xs:field xpath="@uniqueElementName"/> 
     </xs:unique> 
    </xs:element> 

我得到的是類:

public class General{ 
     List<Object> titleOrlifeCicle 
} 

,我會假裝有:

public class General{ 
    String title; 
    String lifeCicle 
    } 

在其他模式能正常工作,但它看起來像在不同的文件架構它不幫助那麼多。有什麼辦法從模式中獲得第二個版本? 謝謝。

+0

不可能回答沒有看到您的架構中的相關內容。 – skaffman 2012-02-29 11:10:36

+0

好吧,你可以在[lom schema]中找到架構(http://ltsc.ieee.org/xsd/lomv1.0/) – pokeRex110 2012-02-29 12:12:51

+2

這並不鼓勵人們回答。如果你想要一個答案,你必須以可消化的形式給人們提供相關信息。 – skaffman 2012-02-29 12:14:41

回答

1

有一點需要確定的是,正確地在衆多XSD中使用相同的內容而不是少數不會改變您生成過程的結果。你的情況的問題是你的模式大量使用xsd:choice,因此你的getter的命名。無限的選擇,你會得到一個清單;你可以使用自定義綁定使名稱更友好,但這不會改變底層結構。在你的情況下,你將不得不瀏覽列表中的對象,試着看看它們是否匹配類「General」或「LifeCycle」,它將會找到你正在尋找屬性的字符串(參見圖表下面)。

LOM.xsd

+0

嗨,謝謝你的回覆。我已經嘗試過它,它的工作原理,但它不值得再用Jaxb,我可以用DOMParser解析對象,我可以有一個更快的解決方案(尤其是解組)。謝謝 – pokeRex110 2012-03-01 16:29:00

+1

@ pokeRex110 ...這樣做不會錯,特別是如果涉及交換的數據不是那麼大。當然,純粹的XML處理模型在版本控制等方面給你提供了更多的靈活性;只要確保以保持代碼可維護的方式進行即可。 – 2012-03-01 16:52:13