2011-08-30 8 views
6

Me gustaría una manera fácil de generar clases de Java a partir de un esquema para poder deserializar fácilmente xml e interpretar utilizando los objetos.¿Cómo puedo generar clases Java para la deserialización xml usando un esquema xml?

Usar Jaxb sería genial, pero estoy abierto a cualquier marco que logre lo mismo. El esquema es el esquema HL7 CDA. Es muy complejo y supongo que es por eso que estoy teniendo problemas con él.

He intentado utilizar xjc y JAXB (esto sería lo ideal), pero ocurre el siguiente error

xjc -d ~/code/ccd/java -p net.msdelta.cda -xmlschema -verbose CDA.xsd 
parsing a schema... 
compiling a schema... 
[INFO] generating code 
unknown location 
Exception in thread "main" java.lang.IllegalArgumentException: trying to create the same field twice: id 
    at com.sun.codemodel.internal.JDefinedClass.field(JDefinedClass.java:408) 
    at com.sun.codemodel.internal.JDefinedClass.field(JDefinedClass.java:379) 
    at com.sun.tools.internal.xjc.generator.bean.field.AbstractFieldWithVar.createField(AbstractFieldWithVar.java:61) 
    at com.sun.tools.internal.xjc.generator.bean.field.SingleField.<init>(SingleField.java:78) 
    at com.sun.tools.internal.xjc.generator.bean.field.SingleField.<init>(SingleField.java:65) 
    at sun.reflect.GeneratedConstructorAccessor8.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.sun.tools.internal.xjc.generator.bean.field.GenericFieldRenderer.generate(GenericFieldRenderer.java:53) 
    at com.sun.tools.internal.xjc.generator.bean.field.DefaultFieldRenderer.generate(DefaultFieldRenderer.java:68) 
    at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.generateFieldDecl(BeanGenerator.java:736) 
    at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.generateClassBody(BeanGenerator.java:524) 
    at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.<init>(BeanGenerator.java:224) 
    at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.generate(BeanGenerator.java:164) 
    at com.sun.tools.internal.xjc.model.Model.generateCode(Model.java:275) 
    at com.sun.tools.internal.xjc.Driver.run(Driver.java:332) 
    at com.sun.tools.internal.xjc.Driver.run(Driver.java:180) 
    at com.sun.tools.internal.xjc.Driver._main(Driver.java:105) 
    at com.sun.tools.internal.xjc.Driver.access$000(Driver.java:63) 
    at com.sun.tools.internal.xjc.Driver$1.run(Driver.java:85) 
+1

¿Tiene el enlace para el XSD que está tratando de generar? – momo

Respuesta

6

Si este problema está siendo causado por un tipo complejo que tiene tanto un atributo y elemento con el mismo nombre, puede utilizar un fijaciones de esquema JAXB archivo para cambiar el nombre del campo correspondiente a uno de los nodos XML:

 <jxb:bindings node="//xs:attributeGroup[@name='db.common.attributes']/xs:attribute[@name='version']"> 
      <jxb:property name="commonVersion"/> 
     </jxb:bindings> 

Si el problema ocurre porque el elemento aparece varias veces en una secuencia (es decir, tanto dentro como fuera de una estructura de elección). El tendrá que utilizar la siguiente extensión XJC:

<jxb:globalBindings> 
    <xjc:simple /> 
</jxb:globalBindings> 

Para un ejemplo completo Ver

enlaces relacionados con JAXB y HL7 CDA esquema

0

creo que puede haber golpeado http://java.net/jira/browse/JAXB-512

JiBX (http: //jibx.sourceforge .net /) es otra alternativa que es mejor en términos de rendimiento que JAXB. Sin embargo, requiere crear un archivo de configuración, pero hay herramientas disponibles que pueden generarlas automáticamente. Más detalles aquí -> http://jibx.sourceforge.net/fromschema/index.html

0

Eclipse EMF puede generar clases a partir de su esquema xsd, con soporte de (de) serialización. EMF también se puede utilizar en aplicaciones independientes (no OSGi).

0

Información de excepción: java.lang.IllegalArgumentException: intentando crear el mismo campo dos veces.

Como dice la excepción, está intentando generar código (JAXB) para un Esquema que tenga el mismo nombre para múltiples atributos y elementos. La solución más simple es agregar un archivo JAXB-Binding.

Propósito de JAXB-Encuadernación: Este archivo se utiliza para especificar los nombres de alias de los elementos repetidos/atributos es decir, si se repite el nombre de "id", puede especificar un nombre de alias como "ID1" con la ruta de ese elemento/atributo.

Ejemplo de archivo Encuadernación:

<jxb:globalBindings> 
    <xjc:simple /> 
</jxb:globalBindings> 

<jxb:bindings schemaLocation="Sample.xsd">   
    <!-- ATTRIBUTES --> 
    <jxb:bindings node="//xs:element[@name='sample']/xs:complexType/xs:attribute[@name='id']"> 
     <jxb:property name="id1"/> 
    </jxb:bindings>   
    <jxb:bindings node="//xs:element[@name='innersample']/xs:complexType/xs:attribute[@name='id']"> 
     <jxb:property name="id2"/> 
    </jxb:bindings> 

    <!-- ELEMENTS -->         
    <jxb:bindings node="//xs:element[@name='sample']/xs:complexType/xs:sequence/xs:element[@name='ID']"> 
     <jxb:property name="id3"/> 
    </jxb:bindings> 
    <jxb:bindings node="//xs:element[@name='innersample']/xs:complexType/xs:sequence/xs:element[@name='ID']"> 
     <jxb:property name="id4"/> 
    </jxb:bindings> 
</jxb:bindings> 

Si está utilizando el IDE NetBeans para JAXB Encuadernación, agregue el archivo de enlace durante la creación, y marca la casilla de verificación "extensión", como XJC es siendo utilizado.

Cuestiones relacionadas