java – 在XML模式中指定IDREF的类型

前端之家收集整理的这篇文章主要介绍了java – 在XML模式中指定IDREF的类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用xjc从 XML模式生成 Java对象.我想使用IDREF在文档中多次引用相同的元素.我还要将IDREF引用的对象限制为特定类型.为了模式验证的目的,我想这样做,而且在Java代码中,被引用的对象作为特定的类型而不是类型Object返回.例如,假设我想要一个模式来描述以下内容
  1. <teams>
  2. <team id="team1">
  3. <coach>coachz</coach>
  4. <player>homestar</player>
  5. <player>marzipan</player>
  6. <player>strongsad</player>
  7. <player>strongbad</player>
  8. </team>
  9.  
  10. <team id="team2">
  11. <coach>bubs</coach>
  12. <player>homesar</player>
  13. <player>thecheat</player>
  14. <player>poopsmith</player>
  15. <player>bubs</player>
  16. </team>
  17.  
  18. <team id="allstars">
  19. <coach>poopsmith</coach>
  20. <player>coachz</player>
  21. <player>bubs</player>
  22. <player>kingoftown</player>
  23. <player>strongbad</player>
  24. </team>
  25. </teams>
  26.  
  27. <people>
  28. <person id="coachz">Coach Z</person>
  29. <person id="homesar">Homesar</person>
  30. <person id="homestar">Homestar</person>
  31. <person id="strongbad">Strong Bad</person>
  32. <person id="strongsad">Strong Sad</person>
  33. <person id="marzipan">Marzipan</person>
  34. <person id="bubs">Bubs</person>
  35. <person id="kingoftown">King of Town</person>
  36. <person id="poopsmith">The Poopsmith</person>
  37. <person id="thecheat">The Cheat</person>
  38. </people>

我可以像这样定义玩家:

  1. <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绑定应用于播放器元素.就像是:
  1. <jaxb:bindings node="xsd:element[@name='player']">
  2. <jaxb:property>
  3. <jaxb:baseType name="....Person"/>
  4. </jaxb:property>
  5. </jaxb:bindings>

您可能需要找出您的模式的正确绑定位置.

我的代码示例:

架构:

  1. <xsd:complexType name="HJIII-53-A">
  2. <xsd:sequence>
  3. <xsd:element name="b" type="xsd:IDREF"/>
  4. <xsd:element name="b1" type="test:HJIII-53-B"/>
  5. <xsd:element name="c" type="xsd:IDREFS"/>
  6. <xsd:element name="c1" type="test:HJIII-53-C" minOccurs="0" maxOccurs="unbounded"/>
  7. </xsd:sequence>
  8. </xsd:complexType>

绑定:

  1. <jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
  2. <jaxb:globalBindings localScoping="toplevel">
  3. <jaxb:serializable/>
  4. </jaxb:globalBindings>
  5. <jaxb:bindings node="xsd:complexType[@name='HJIII-53-A']//xsd:element[@name='b']">
  6. <jaxb:property>
  7. <jaxb:baseType name="org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B"/>
  8. </jaxb:property>
  9. </jaxb:bindings>
  10. <jaxb:bindings node="xsd:complexType[@name='HJIII-53-A']//xsd:element[@name='c']">
  11. <jaxb:property>
  12. <jaxb:baseType name="org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C"/>
  13. </jaxb:property>
  14. </jaxb:bindings>
  15. </jaxb:bindings>

生成代码

  1. @XmlElement(required = true,type = Object.class)
  2. @XmlIDREF
  3. @XmlSchemaType(name = "IDREF")
  4. protected org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B b;
  5. @XmlElement(required = true)
  6. protected org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53B b1;
  7. @XmlList
  8. @XmlElement(required = true,type = Object.class)
  9. @XmlIDREF
  10. protected List<org.jvnet.hyperjaxb3.ejb.tests.issuesjpa2.HJIII53C> c;
  11. 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/

猜你在找的Java相关文章