2011-04-05 25 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