因此,我一直在阅读在JAXB here中使用ID和IDREF的内容,在所示示例中,它们使用了1个IDREF元素,该元素在生成的Java代码中显示为对象。我同时包括了XML模式...

<xsd:complexType name="CustomerType">
  <xsd:sequence>
    <xsd:element name="id"   type="xsd:ID"/>
    <xsd:element name="name" type="xsd:string"/>
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="OrderType">
  <xsd:sequence>
    <xsd:choice>
      <xsd:element name="customer" type="CustomerType"/>
      <xsd:element name="custref"  type="xsd:IDREF"/>
    </xsd:choice>
    <xsd:element name="items" type="ItemType" maxOccurs="unbounded"/>
  </xsd:sequence>
</xsd:complexType>


和后代的Java代码。

public class OrderType {

    protected CustomerType customer;
    protected Object custref;
    protected List items;

    public CustomerType getCustomer() {
        return customer;
    }

    public void setCustomer(CustomerType value) {
        this.customer = value;
    }

    public Object getCustref() {
        return custref;
    }

    public void setCustref(Object value) {
        this.custref = value;
    }

    public List getItems() {
        if (items == null) {
            items = new ArrayList();
        }
        return this.items;
    }
}


现在,在我的代码中,我尝试了一些不同的操作,以以下模式为例:

<xsd:complexType name="SimViewType">
    <xsd:sequence>
        <xsd:element name="NAME" type="xsd:string"></xsd:element>
        <xsd:element name="ITEM" type="am:SimItemIDREF" minOccurs="0" maxOccurs="unbounded"></xsd:element>
    </xsd:sequence>
    <xsd:attribute name="id" type="xsd:ID" use="required"></xsd:attribute>
</xsd:complexType>

<xsd:simpleType name="SimItemIDREF">
    <xsd:restriction base="xsd:IDREF"></xsd:restriction>
</xsd:simpleType>


尽管我已经在SimItemIDREF中包含了通用IDREF,但这只是为了提高可读性。但是,即使我改用普通的xsd:IDREF,我使用非1的简单事实也意味着我的Java代码以以下内容结束...

public class SimViewType {
    ...
    protected List<JAXBElement<Object>> item;
    ...
}


我得到的是List<Object>而不是List<JAXElement<Object>>。现在,如果我想制作一个JAXElement,我可以做得很好,但是由于JAXElement<SimItemType>JAXElement<Object>之间没有转换,所以我不能将其添加到SimViewType中。 SimViews实际上不保持对SimItems的控制的想法在我的设计中至关重要,因此仅删除引用并不是一个好主意,因为它可能会在运行时造成危险的差异。

如何创建SimItemType或JAXBElement以便可以将其与SimViewType一起使用?

最佳答案

XJC使用createSimViewTypeITEM方法生成ObjectFactory来创建ITEM元素。

/**
 * Create an instance of {@link JAXBElement }{@code <}{@link Object }{@code >}}
 *
 */
@XmlElementDecl(namespace = "", name = "ITEM", scope = SimViewType.class)
@XmlIDREF
public JAXBElement<Object> createSimViewTypeITEM(Object value) {
    return new JAXBElement<Object>(_SimViewTypeITEM_QNAME, Object.class, SimViewType.class, value);
}


有帮助吗?

08-28 21:57