错误:在xs:choice的情况下,无法通过xjc解析架构

时间:2012-03-13 13:16:24

标签: java xsd jaxb

我想使用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

3 个答案:

答案 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>