xsd 两个xsd整合
xsd:choice
是一种较为常见的XML构造。 但是,将xsd:choice
映射到编程语言并不总是那么简单。 例如,JAX-RPC规范定义的Web服务的Java映射没有提供从xsd:choice
到Java的显式映射。 每当JAX-RPC代码生成器在类型定义中遇到xsd:choice
时,它都会将该类型映射到javax.xml.soap.SOAPElement
。 SOAPElement
是SAAJ API的一部分,它不是一个非常用户友好的API。
您可以采取一些措施以获得更好的API。 如果您能够更改XML模式,一个不错的选择是用多态替换xsd:choice
。
比较xsd:choice
和多态
多态性的意思是“许多形状”。 例如,可以使用基本类型声明方法参数。 调用该方法时,该参数的实例是该类型的特定扩展。
您可以类似地描述xsd:choice
。 可以使用描述所有可能选择的类型声明方法参数。 调用该方法时,该参数的实例将包含特定的选择。
实际的单词是不同的,但是它们的含义本质上是相同的。
将简单的xsd:choice
类型映射为多态类型
要将典型选择类型转换为一组多态类型,需要在给定选择类型C下执行以下操作,其中包含选择c1..cn:
- 构建包含C的那些元素(不是选择元素)的抽象类型
P
- 对于c1..cn中的每个c,构建
E of P
的扩展类型E of P
其中包含c的元素。
用示例理解概念总是比较容易的。 看一下付款选项的声明。 清单1是选择类型。 清单2是对一组多态类型的转换。
清单1.选择付款
<complexType name="Payment">
<sequence>
<element name="amount" type="int"/>
<choice>
<element name="cash" nillable="true" type="string"/>
<element name="check" type="tns:Check"/>
<element name="credit" type="tns:Credit"/>
</choice>
</sequence>
</complexType>
<complexType name="Check">
<sequence>
<element name="checkNo" type="int"/>
</sequence>
</complexType>
<complexType name="Credit">
<sequence>
<element name="cardNo" type="string"/>
<element name="expiration" type="date"/>
</sequence>
&