我试图通过从Java开始并使用schemagen(长篇故事)来复制一些模式。架构如下所示:
<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运行这些时,我收到错误
错误:XmlElementRef指向一个不存在的类。
我知道问题出在“接受”和“拒绝”,但我该如何解决?我是否需要支持这些元素名称的类?例如,如果我创建一个这样的类:
@XmlRootElement(name="Accepted")
public class Accepted extends ResponseType { }
schemagen接受了它。但是,为什么我需要这种实施呢?
答案 0 :(得分: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