2011-08-30 12 views
6

스키마에서 자바 클래스를 생성하여 XML을 비 직렬화하고 객체를 사용하여 해석 할 수있는 쉬운 방법을 원합니다.xml 스키마를 사용하여 xml deserialization을위한 Java 클래스를 생성하려면 어떻게해야합니까?

Jaxb를 사용하면 좋겠지 만 동일한 작업을 수행 할 수있는 모든 프레임 워크를 사용할 수 있습니다. 스키마는 HL7 CDA 스키마입니다. 그것은 매우 복잡하고 그것이 내가 그 문제를 가지고있는 이유라고 생각합니다.

나는 (이 이상적 일 것이다)하지만 난 얻을 xjc를하고 JAXB를 사용하여 시도

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

생성하려는 XSD에 대한 링크가 있습니까? – momo

답변

6

이 문제는 다음이 XML 노드 중 하나에 해당하는 필드 이름 변경 정보 파일 JAXB 스키마 바인딩을 사용하여 같은 이름의 속성과 요소를 모두 가진 복합 형에 의해 발생하는 경우 :

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

요소가 시퀀스 (즉, 선택 구조 안팎 모두)에 여러 번 나타나기 때문에 문제가 발생하는 경우. JAXB 및 HL7 CDA 스키마

0

난 당신이 http://java.net/jira/browse/JAXB-512

JiBX는 (HTTP 공격했다고 생각 다음과 같은 오류 : //jibx.sourceforge를 .net /)은 JAXB보다 성능면에서 좋은 대안입니다. 구성 파일을 생성해야합니다. 그러나 자동으로 생성 할 수있는 도구가 있습니다. 자세한 내용은 여기에 -> http://jibx.sourceforge.net/fromschema/index.html

0

Eclipse EMF는 (비) 직렬화 지원을 사용하여 xsd 체계에서 클래스를 생성 할 수 있습니다. EMF는 독립 실행 형 (비 OSGi) 앱에도 사용할 수 있습니다.

0

예외 정보 : java.lang.IllegalArgumentException : 같은 필드를 두 번 만들려고합니다.

예외로, 여러 속성 및 요소에 대해 동일한 이름을 가진 스키마에 대한 코드 (JAXB)를 생성하려고합니다. 가장 간단한 해결 방법은 JAXB-Binding 파일을 추가하는 것입니다. JAXB - 바인딩의

목적 :이 파일은 반복되는 요소에 대한 별명을 지정하는 데 사용됩니다/"ID"이름을 반복 즉, 당신이 그 경로로 "ID1"로 별칭 이름을 지정할 수 있습니다 속성 요소/속성.

샘플 바인딩 파일 :

<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> 

는 JAXB 바인딩에 대한 넷빈즈 IDE를 사용하는 경우, 작성시 바인딩 파일을 추가하고, XJC가 한, "확장"체크 상자를 선택 사용되고있다.

관련 문제