gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:26:16 24 4
gpt4 key购买 nike

我想要一种从模式生成 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)

最佳答案

如果此问题是由具有同名属性和元素的复杂类型引起的,那么您可以使用 JAXB 模式绑定(bind)文件来更改与其中一个 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 架构的相关链接

关于java - 如何使用 xml 模式为 xml 反序列化生成 java 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7238643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com