我想从模式生成Java类的简单方法,以便我可以轻松地反序列化xml并使用对象进行解释。
使用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)
答案 0 :(得分:6)
如果此问题是由具有属性和具有相同名称的元素的复杂类型引起的,那么您可以使用JAXB模式绑定文件来更改与其中一个XML节点对应的字段名称:
<jxb:bindings node="//xs:attributeGroup[@name='db.common.attributes']/xs:attribute[@name='version']">
<jxb:property name="commonVersion"/>
</jxb:bindings>
如果问题发生,因为元素在序列中多次出现(即在选择结构的内部和外部)。您需要使用以下XJC扩展名:
<jxb:globalBindings>
<xjc:simple />
</jxb:globalBindings>
有关完整示例,请参阅
JAXB和HL7 CDA架构的相关链接
答案 1 :(得分:0)
我想你可能已经点击了http://java.net/jira/browse/JAXB-512
JiBX(http://jibx.sourceforge.net/)是另一种在性能方面比JAXB更好的选择。它需要创建一个配置文件 - 但是有一些工具可以自动生成它们。更多细节 - &gt; http://jibx.sourceforge.net/fromschema/index.html
答案 2 :(得分:0)
答案 3 :(得分:0)
异常信息: java.lang.IllegalArgumentException:尝试两次创建相同的字段。
正如异常所说,您正在尝试为多个属性和元素具有相同名称的Schema生成代码(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>
如果您使用NETBEANS IDE进行JAXB绑定,请在创建过程中添加Binding文件,并在使用XJC时选中“Extension”复选框。