2012-03-13 14 views
8

Pregunta: ¿Cómo hago xjc/JAXB generar los javaclasses propper para varios esquemas que contienen elementdefinitions duplicados en el mismo espacio de nombres?que contienen definiciones duplicadas Compilar varias de XSD de un mismo elemento con JAXB

Información: Tengo tres esquemas .xsd: A, B y C. Todos tienen el mismo espacio de nombre de destino. Son las 3 shemas que se me han dado, y no estoy permitido, de ninguna manera, cambiarlas de ninguna manera.

Ellos A tiene algunos elementos que también se encuentra en B o C (pero A tiene una gran cantidad de auto declaró elementos, así) Ejemplo: Este es el mismo "código" para A y 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> 

al utilizar xjc a recopilarlos en javaclasses, me sale el siguiente excepción:

[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 

y lo mismo sucede con los otros elementos: arcgYearType, arcgYearMonthType y arcDateType.

He leído acerca de un archivo de enlace que quizás podría resolver este problema, pero no estoy seguro de cómo hacerlo, por lo que los ejemplos serán muy preferidos.

Respuesta

0

Puede resolver conflictos manualmente utilizando el archivo de enlace. Aquí está el ejemplo, donde se puede especificar el nombre personalizado para los nombres en conflicto:

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

¿Esto no cambia el nombre de los elementos XML cuando aparecen, o simplemente se renombra el javaclasses que se genera? –

+0

Está cambiando el nombre de la clase java generada. Por defecto obtienes 'FixedIncomeBook.java' y con este enlace obtienes' PartyFixedIncomeBook.java' –

+0

obtengo: [ERROR] Espacio de nombres de enlace no soportado "". Quizás quiso decir "http://java.sun.com/xml/ns/jaxb/xjc"? línea 4 del archivo: /../ C.xsd La línea 4 es definiciones de esquema: ¿Puedes ver lo que está mal? –

2

De lo que usted describe, supongo que no hay relación entre incluyen los archivos XSD. Además, debo suponer que estás tratando de reutilizar las clases, donde el contenido se superpone.

La salida más fácil es "compilar" cada archivo de forma independiente y proporcionar un paquete de Java diferente para cada uno de los archivos XSD. El problema aquí es que si intenta "encadenar" el contenido de un XML a otro (es decir, unmarshall de A y luego Marshall a B), entonces la clase C1 en el paquete com.A, y la clase C1 en el paquete com.B, mientras que que coincidan con el mismo tipo de complejo XSD, no son "intercambiables"; Tendrás que desarrollar una conversión entre ellos. Necesita un archivo de enlace personalizado o si usa NetBeans, simplemente configure diferentes paquetes en el asistente de JAXB.

La mejor manera podría ser utilizar episodios (consulte this on SO). Procesar A.xsd, luego usar ese episodio para procesar B.xsd, etc.

+0

1. No, no hay inclusión. 2. Sí, quiero reutilizar, ya que son lo mismo, pero ese no es el objetivo principal, por lo que si hacer otra cosa es más fácil, entonces que así sea. No me interesa algo de A.xsd en C.xsd, solo los uso todos en el mismo proyecto. ¿Existe una manera directa de hacer que los paquetes difieran aunque sus xsd provengan del mismo TNS? –

+0

@Sofus, entonces ¿por qué no estás usando episodios? ¿O ejecuta xjc contra cada paquete utilizando un enlace personalizado que apunta a diferentes espacios de nombres? –

+0

Lo intentaré dentro de las próximas 20 horas, gracias –

Cuestiones relacionadas