2011-04-05 278 views
0

我試圖通過從Java開始並使用schemagen(長故事)來複制一點架構。該模式是這樣的:問題使用@XmlElementRef創建模式

<xsd:element name="Responses"> 
    <xsd:complexType> 
     <xsd:choice maxOccurs="unbounded"> 
     <xsd:element ref="tns:Accepted"/> 
     <xsd:element ref="tns:Rejected"/> 
     <xsd:element ref="oth:Exception"/> 
     </xsd:choice> 
    </xsd:complexType> 
</xsd:element> 

<xsd:element name="Accepted" type="tns:ResponseType"/> 
<xsd:element name="Rejected" type="tns:ResponseType"/> 

<xsd:complexType name="ResponseType"> 
    <xsd:sequence> 
    <xsd:element name="Id" type="xsd:anyURI"/> 
    <!-- more valid elements --> 
    </xsd:sequence> 
</xsd:complexType> 

我創建了下面的類來表示它:

@XmlRootElement(name="Responses") 
public class Responses { 

    @XmlElementRefs(value = { 
      @XmlElementRef(name="Accepted", namespace="http://sample.net", type=ResponseType.class), 
      @XmlElementRef(name="Rejected", namespace="http://sample.net", type=ResponseType.class), 
      @XmlElementRef(name="Exception", namespace="http://other.net", type=ExceptionType.class) 
    }) 
    public List<JAXBElement<Object>> response; 
} 

「接受」和「拒絕」僅在ObjectFactory的定義和無級備份的名稱:

@XmlElementDecl(namespace = "http://sample.net", name = "Accepted") 
public JAXBElement<ResponseType> createAccepted(ResponseType value) { 
    return new JAXBElement<ResponseType>(_Accepted_QNAME, ResponseType.class, null, value); 
} 

當我通過schemagen運行這些,我得到的錯誤

error: XmlElementRef points to a non-existent class.

我知道問題與「接受」和「拒絕」,但我該如何解決它?我需要支持這些元素名稱的類嗎?例如,如果我製作這樣的課程:

@XmlRootElement(name="Accepted") 
public class Accepted extends ResponseType { } 

schemagen接受它。但是,爲什麼我需要這種實現?

回答

0

是的,您需要定義類型ResponseType。

是這樣的:

<xs:complexType name="ResponseType"> 
    <xs:choice maxOccurs="unbounded"> 
     <xs:element name="name" type="xs:string"/> 
     <xs:any namespace="##other" processContents="lax"/> 
    </xs:choice> 
</xs:complexType> 

您的最終元素將是這樣的: 一些字符串 一些字符串

<xs:simpleType name="ResponseType"> 
    <xs:restriction base="xs:string"/> 
</xs:simpleType> 

將有 somestring

+0

對不起,我肩膀d表示ResponseType存在。我會稍微編輯一下這個問題。 – 2011-04-05 21:40:48