我使用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>
我可以像这样定义玩家:
<xs:element name="player" type="xs:IDREF" maxOccurs="unbounded"/>
但是在Java代码中,当我尝试检索一个播放器时,它将作为类型对象返回,我必须将其转换为一个人.在这一点上,如果有人错误地引用了一个Team对象,那么我有错误可以在验证时被捕获.我想指定这样的东西:
< xs:element name =“player”type =“xs:IDREF”reftype =“person”maxOccurs =“unbounded”/>
但是据我所知,没有办法指定一个类型,就像我在这里所做的那样设计的属性“reftype”一样.可以使用IDREF来完成吗?如果没有,还有另一种方法吗?
解决方法
您可以简单地将baseType绑定应用于播放器元素.就像是:
<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;
见:https://svn.java.net/svn/hj3~svn/trunk/ejb/tests/issues-jpa2/src/main/resources/