如何使用XML模式生成用于XML反序列化的Java类? [英] How can I generate java classes for xml deserialization using an xml schema?

查看:62
本文介绍了如何使用XML模式生成用于XML反序列化的Java类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'd like an easy way to generate Java classes from a schema so that I can easily deserialize xml and interpret using the objects.

使用Jaxb会很棒,但是我愿意接受任何可以完成相同任务的框架.该架构是HL7 CDA架构.这非常复杂,我想这就是为什么我遇到问题的原因.

Using Jaxb would be great, but I'm open to any framework that will accomplish the same thing. The schema is the HL7 CDA Schema. It's very complex and I'm guessing that's why I'm having problems with it.

我尝试使用xjc和JAXB(这很理想),但是出现以下错误

I tried using xjc and JAXB (this would be ideal) but I get an the following 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)

推荐答案

如果此问题是由具有相同名称的属性和元素的复杂类型引起的,则可以使用JAXB模式绑定文件来更改字段与其中一个XML节点相对应的名称:

If this problem is being caused by a complex type having both an attribute and element with the same name then you can use a JAXB schema bindings file to change the field name corresponding to one of the XML nodes:

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

如果出现问题是因为元素按顺序出现了多次(即在选择结构的内部和外部).您将需要使用以下XJC扩展名:

If the problem is occurring because the element appears multiple times in a sequence (i.e. both inside and outside a choice structure). The you will need to use the following XJC extension:

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

有关完整示例,请参见

JAXB和HL7 CDA架构的相关链接

Related Links to JAXB and HL7 CDA Schema

这篇关于如何使用XML模式生成用于XML反序列化的Java类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆