Java 在XML架构中指定IDREF的类型

Java 在XML架构中指定IDREF的类型,java,jaxb,xsd,xjc,Java,Jaxb,Xsd,Xjc,我使用xjc从XML模式生成Java对象。我想使用IDREF在文档中多次引用同一元素。我还希望将IDREF引用的对象约束为特定类型。我这样做是为了进行模式验证,但也为了在Java代码中,引用的对象作为特定类型而不是类型对象返回。例如,假设我想要一个模式来描述以下内容: <teams> <team id="team1"> <coach>coachz</coach> <player>homestar</player

我使用xjc从XML模式生成Java对象。我想使用IDREF在文档中多次引用同一元素。我还希望将IDREF引用的对象约束为特定类型。我这样做是为了进行模式验证,但也为了在Java代码中,引用的对象作为特定类型而不是类型对象返回。例如,假设我想要一个模式来描述以下内容:

<teams>
  <team id="team1">
    <coach>coachz</coach>
    <player>homestar</player>
    <player>marzipan</player>
    <player>strongsad</player>
    <player>strongbad</player>
  </team>

  <team id="team2">
    <coach>bubs</coach>
    <player>homesar</player>
    <player>thecheat</player>
    <player>poopsmith</player>
    <player>bubs</player>
  </team>

  <team id="allstars">
    <coach>poopsmith</coach>
    <player>coachz</player>
    <player>bubs</player>
    <player>kingoftown</player>
    <player>strongbad</player>
  </team>
</teams>

<people>
 <person id="coachz">Coach Z</person>
 <person id="homesar">Homesar</person>
 <person id="homestar">Homestar</person>
 <person id="strongbad">Strong Bad</person>
 <person id="strongsad">Strong Sad</person>
 <person id="marzipan">Marzipan</person>
 <person id="bubs">Bubs</person>
 <person id="kingoftown">King of Town</person>
 <person id="poopsmith">The Poopsmith</person>
 <person id="thecheat">The Cheat</person>
</people>
但是在Java代码中,当我试图检索一个播放器时,它将作为类型对象返回,我必须将它转换为一个人。在这一点上,如果有人错误地引用了一个团队对象,我就要处理一些可能在验证时被发现的错误。我想指定如下内容:

<xs:element name="player" type="xs:IDREF" maxOccurs="unbounded"/>


但就我所知,没有办法像我在这里使用人为属性“reftype”那样指定类型。可以使用IDREF实现这一点吗?如果没有,还有其他方法吗?

您可以简单地将
baseType
绑定应用于
player
元素。比如:

<jaxb:bindings node="xsd:element[@name='player']">
    <jaxb:property>
        <jaxb:baseType name="....Person"/>
    </jaxb:property>
</jaxb:bindings>

您可能需要为您的架构找出正确的绑定位置

我的代码中的示例:

模式:

<xsd:complexType name="HJIII-53-A">
    <xsd:sequence>
        <xsd:element name="b" type="xsd:IDREF"/>
        <xsd:element name="b1" type="test:HJIII-53-B"/>
        <xsd:element name="c" type="xsd:IDREFS"/>
        <xsd:element name="c1" type="test:HJIII-53-C" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
</xsd:complexType>

绑定:

<jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
    <jaxb:globalBindings localScoping="toplevel">
        <jaxb:serializable/>
    </jaxb:globalBindings>
    <jaxb:bindings node="xsd:complexType[@name='HJIII-53-A']//xsd:element[@name='b']">
        <jaxb:property>
            <jaxb:baseType name="org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B"/>
        </jaxb:property>
    </jaxb:bindings>
    <jaxb:bindings node="xsd:complexType[@name='HJIII-53-A']//xsd:element[@name='c']">
        <jaxb:property>
            <jaxb:baseType name="org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C"/>
        </jaxb:property>
    </jaxb:bindings>
</jaxb:bindings>

生成的代码:

@XmlElement(required = true, type = Object.class)
@XmlIDREF
@XmlSchemaType(name = "IDREF")
protected org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B b;
@XmlElement(required = true)
protected org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B b1;
@XmlList
@XmlElement(required = true, type = Object.class)
@XmlIDREF
protected List<org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C> c;
protected List<org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C> c1;
@xmlement(必需=true,类型=Object.class)
@XmlIDREF
@XmlSchemaType(name=“IDREF”)
受保护的org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B;
@XmlElement(必需=true)
受保护的org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B b1;
@XML列表
@XmlElement(必需=true,类型=Object.class)
@XmlIDREF
受保护名单c;
受保护名单c1;

请看:

lexicore的答案给了我所需要的(我建议投票支持他的答案而不是我的答案)。但是,我使用的是内联注释,而不是单独的绑定文件。使用我的Homestar示例,内联注释就是这样的:

<xs:element name="player" type="xs:IDREF" maxoccurs="unbounded">
  <xs:annotation>
    <xs:appinfo>
      <jaxb:property>
        <jaxb:baseType name="Person"/>
      </jaxb:property>
    </xs:appinfo>
  </xs:annotation>
</xs:element>


工作起来很有魅力!我正在使用内联注释。我将添加一个答案,说明我是如何做到的。哈!jaxb绑定正是我想要的。谢谢遗憾的是,它似乎不能很好地处理从jaxb2 basicsA ref到Homestar Runner生成的hashcode函数+1.