我想使用jaxb从模式生成java类,但是我从xjc得到了一个解析错误。我有2个元素包含在一个选项中,然后在选择之后再次重复其中一个元素:
<xs:element name="A">
<xs:complexType>
<xs:choice>
<xs:sequence maxOccurs="unbounded">
<xs:element ref="X"/>
<xs:element ref="Y"/>
</xs:sequence>
<xs:element ref="Y"/>
</xs:choice>
</xs:complexType>
</xs:element>
jaxb投掷:
[ERROR] Element "{*something*}Y" shows up in more than one properties.
line *something* of file:/*something*.xsd
PS:我的jaxb版本是2.1.13
答案 0 :(得分:6)
看看这个post on SO。解决方案是提供一个自定义绑定文件,将您的Y映射到选择之外,以使用另一个属性名称。
我可能还会将重复序列映射到具有两个属性(X和Y)的类,但这是其他的。
我还尝试了一个测试模式(源自你的,只是为X和Y添加了虚拟复杂元素)和免费的NetBeans IDE 7.1版本,它可以在不需要自定义绑定文件的情况下完成。我使用的JAXB版本是2.2.4
答案 1 :(得分:2)
我也试图让它像Petru描述的那样工作。 Rahul还没有发布他的解决方案,所以这里是我的绑定文件。
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc"
version="2.1">
<jaxb:bindings schemaLocation="test.xsd" node="//xs:element[@name='A']/xs:complexType/xs:choice[1]">
<jaxb:property name="OutsideY"/>
</jaxb:bindings>
</jaxb:bindings>
XJC输出:
$xjc -version
xjc version "JAXB 2.1.10 in JDK 6"
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build JAXB 2.1.10 in JDK 6)
$xjc -p com.example.test -d src -extension -b bindings.xml test.xsd
parsing a schema...
compiling a schema...
com\example\test\A.java
com\example\test\ObjectFactory.java
答案 2 :(得分:0)
也许有人会读到以下内容: org.jvnet.jaxb2_commons。 jaxb2-basics在引用上不起作用! 我确实尝试了很多方法来使此插件正常工作,但您做不到。 (在github页面上也有提及)
@Stanislav Mamontov帮助了我很多。
如果有人好奇,这也适用于团体:
XSD:
<xsd:group name="OpticalID">
<xsd:sequence>
<xsd:choice>
<xsd:sequence>
<xsd:group ref="MPCID"/>
<xsd:element ref="trkSub" minOccurs="0"/>
</xsd:sequence>
<xsd:sequence>
<xsd:element ref="trkSub"/>
</xsd:sequence>
</xsd:choice>
</xsd:sequence>
绑定:
<jaxb:bindings node="xsd:group[@name='OpticalID']//xsd:sequence[1]/xsd:choice[1]/xsd:sequence[1]/xsd:element[@ref='trkSub']">
<jaxb:property name="trkSubOrNull"/>
</jaxb:bindings>