我正在使用 xjc 从 XML 模式生成 Java 对象。我想使用 IDREF 在文档中多次引用同一个元素。我还想将 IDREF 引用的对象限制为特定类型。我想这样做是为了模式验证,但也是为了在 Java 代码中,引用的对象作为特定类型而不是 Object 类型返回。例如,假设我想要一个模式来描述以下内容:
<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>
我可以player
这样定义:
<xs:element name="player" type="xs:IDREF" maxOccurs="unbounded"/>
但是在 Java 代码中,当我尝试检索一个播放器时,它将作为类型对象返回,我必须将它转换为一个人。那时,如果有人错误地引用了 Team 对象,我就有可能在验证时发现的错误要处理。我想指定这样的东西:
<xs:element name="player" type="xs:IDREF"
reftype="person"
maxOccurs="unbounded" />
但据我所知,没有办法像我在此处使用人为的属性“reftype”所做的那样指定类型。这可以使用 IDREF 完成吗?如果没有,还有其他方法吗?