2012-03-13 4 views
8

Domanda: come faccio a fare xjc/JAXB generare il javaclasses Propper per diversi schemi contenenti elementdefinitions duplicati nello stesso spazio dei nomi?contenenti le definizioni duplicati di compilare più di XSD dello stesso elemento con JAXB

Informazioni: Ho tre schemi .xsd: A, B e C. hanno tutti lo stesso targetNamespace. Sono tutti 3 shemas che mi sono stati dati, e non sono, in alcun modo possibile, autorizzato a cambiarli in alcun modo.

Essi A ha alcuni elementi che si trova anche in B o C (ma A ha un sacco di sé elementi così dichiarato) Esempio: Questo è lo stesso "codice" per A e 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> 

Quando si utilizza xjc per compilare in javaclasses, ottengo la seguente eccezione:

[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 

e lo stesso accade per gli altri elementi: arcgYearType, arcgYearMonthType e arcDateType.

Ho letto di un file di bind che potrebbe risolvere questo problema, ma non sono sicuro su come farlo in modo che gli esempi siano altamente preferiti.

risposta

0

È possibile risolvere i conflitti manualmente utilizzando il file di bind. Ecco l'esempio, dove è possibile specificare il nome personalizzato per i nomi in conflitto:

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

Non si sta rinominando acuitivamente gli elementi XML quando escono, o si sta semplicemente rinominando i javaclasses che vengono generati? –

+0

Sta rinominando la classe java generata. Per impostazione predefinita si ottiene 'FixedIncomeBook.java' e con questa associazione si ottiene' PartyFixedIncomeBook.java' –

+0

ottengo: [ERRORE] Spazio dei nomi di binding non supportato "". Forse intendevi "http://java.sun.com/xml/ns/jaxb/xjc"? riga 4 del file: /../ C.xsd La riga 4 è definizioni dello schema: Puoi vedere cosa c'è che non va? –

2

Da ciò che si descrive, suppongo che non v'è alcuna relazione tra includono i file XSD. Inoltre, suppongo che tu stia cercando di riutilizzare le classi, dove il contenuto si sovrappone.

La via facile è quella di "compilare" ogni file in modo indipendente e fornire un pacchetto Java diverso per ciascuno dei file XSD. Il problema qui è che se si tenta di "concatenare" insieme il contenuto da un XML a un altro (ad esempio unmarshall da A e quindi da marshall a B), quindi la classe C1 nel pacchetto com.A e la classe C1 nel pacchetto com.B, mentre corrispondenti allo stesso tipo di XSD complesso, non sono "intercambiabili"; dovrai sviluppare una conversione tra di loro. È necessario un file di bind personalizzato o se si utilizza NetBeans, è sufficiente impostare diversi pacchetti nella procedura guidata JAXB.

Il modo migliore potrebbe essere utilizzare gli episodi (vedere this on SO). Elabora A.xsd, quindi usa quell'episodio per processare B.xsd, ecc.

+0

1. No non è incluso. 2. Sì, voglio riutilizzarlo, dato che sono uguali, ma questo non è l'obiettivo principale, quindi se fare qualcos'altro è più facile allora così sia. Non mi interessa qualcosa da A.xsd in C.xsd, li uso tutti nello stesso progetto. C'è un modo semplice per far differire i pacchetti anche se i loro xsd provengono dalla stessa TNS? –

+0

@Sofus, allora perché non stai usando episodi? Oppure esegui xjc su ogni pacchetto usando un binding personalizzato che punta su diversi namespaces? –

+0

Farò un tentativo in 20 ore circa, grazie –