Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用xml模式生成用于xml反序列化的java类?_Java_Xsd_Jaxb - Fatal编程技术网

如何使用xml模式生成用于xml反序列化的java类?

如何使用xml模式生成用于xml反序列化的java类?,java,xsd,jaxb,Java,Xsd,Jaxb,我想要一种从模式生成Java类的简单方法,这样我就可以轻松地反序列化xml并使用对象进行解释 使用Jaxb会很好,但我愿意接受任何能够实现相同功能的框架。该模式是HL7CDA模式。这是非常复杂的,我猜这就是为什么我有问题的原因 我尝试使用xjc和JAXB(这将是理想的),但我得到了一个错误,错误如下 xjc -d ~/code/ccd/java -p net.msdelta.cda -xmlschema -verbose CDA.xsd parsing a schema... compilin

我想要一种从模式生成Java类的简单方法,这样我就可以轻松地反序列化xml并使用对象进行解释

使用Jaxb会很好,但我愿意接受任何能够实现相同功能的框架。该模式是HL7CDA模式。这是非常复杂的,我猜这就是为什么我有问题的原因

我尝试使用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)
xjc-d~/code/ccd/java-pnet.msdelta.cda-xmlschema-verbose cda.xsd
正在分析架构。。。
正在编译架构。。。
[信息]生成代码
未知位置
线程“main”java.lang.IllegalArgumentException中出现异常:尝试创建同一字段两次:id
位于com.sun.codemodel.internal.JDefinedClass.field(JDefinedClass.java:408)
位于com.sun.codemodel.internal.JDefinedClass.field(JDefinedClass.java:379)
位于com.sun.tools.internal.xjc.generator.bean.field.AbstractFieldWithVar.createField(AbstractFieldWithVar.java:61)
位于com.sun.tools.internal.xjc.generator.bean.field.SingleField.(SingleField.java:78)
位于com.sun.tools.internal.xjc.generator.bean.field.SingleField.(SingleField.java:65)
位于sun.reflect.GeneratedConstructorAccessor8.newInstance(未知源)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:513)
位于com.sun.tools.internal.xjc.generator.bean.field.GenericFieldRenderer.generate(GenericFieldRenderer.java:53)
位于com.sun.tools.internal.xjc.generator.bean.field.DefaultFieldRenderer.generate(DefaultFieldRenderer.java:68)
在com.sun.tools.internal.xjc.generator.bean.BeangGenerator.generateFieldDecl(BeangGenerator.java:736)上
位于com.sun.tools.internal.xjc.generator.bean.BeangGenerator.generateClassBody(BeangGenerator.java:524)
位于com.sun.tools.internal.xjc.generator.bean.BeangGenerator(BeangGenerator.java:224)
位于com.sun.tools.internal.xjc.generator.bean.BeangGenerator.generate(BeangGenerator.java:164)
位于com.sun.tools.internal.xjc.model.model.generateCode(model.java:275)
位于com.sun.tools.internal.xjc.Driver.run(Driver.java:332)
位于com.sun.tools.internal.xjc.Driver.run(Driver.java:180)
位于com.sun.tools.internal.xjc.Driver.\u main(Driver.java:105)
位于com.sun.tools.internal.xjc.Driver.access$000(Driver.java:63)
位于com.sun.tools.internal.xjc.Driver$1.run(Driver.java:85)
我想你可能打了


吉布斯(http://jibx.sourceforge.net/)是另一种性能优于JAXB的替代方案。它需要创建一个配置文件,但是有一些工具可以为您自动生成配置文件。更多详情请点击此处->http://jibx.sourceforge.net/fromschema/index.html

Eclipse EMF可以从xsd方案生成类,并支持(反)序列化。
EMF也可以在独立(非OSGi)应用程序中使用。

如果此问题是由具有相同名称的属性和元素的复杂类型引起的,则可以使用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和HL7CDA模式的相关链接


异常信息:java.lang.IllegalArgumentException:尝试创建同一字段两次

正如异常所说,您正在尝试为多个属性和元素的模式生成代码(JAXB),该模式具有相同的名称。最简单的解决方法是添加JAXB绑定文件

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绑定,请在创建过程中添加绑定文件,并选中“扩展名”复选框,因为正在使用XJC。

您是否有尝试生成的XSD的链接?