34.4. 列表
概述
XML Schema 支持定义数据类型的机制,它们是以空格分隔的简单类型的列表。例 34.7 “列出类型示例” 中显示一个使用列表类型的元素示例 primeList
。
例 34.7. 列出类型示例
<primeList>1 3 5 7 9 11 13<\primeList>
<primeList>1 3 5 7 9 11 13<\primeList>
XML 架构列表类型通常映射到 Java List<T>
对象。这个模式的唯一变化是消息部分直接映射到 XML Schema 列表类型的实例。
在 XML 架构中定义列表类型
XML Schema 列表类型是一个简单的类型,因此通过使用 simpleType
元素来定义。例 34.8 “XML 架构列表类型的语法” 中显示用来定义列表类型的最常见语法。
例 34.8. XML 架构列表类型的语法
<simpleType name="listType"> <list itemType="atomicType"> <facet value="value" /> <facet value="value" /> ... </list> </simpleType>
<simpleType name="listType">
<list itemType="atomicType">
<facet value="value" />
<facet value="value" />
...
</list>
</simpleType>
为 atomicType 给出的值定义列表中元素的类型。它只能是 XML 架构原子类型中的一个,如 xsd:int
或 xsd:string
,也可以是用户定义的简单类型,它不是列表。
除了定义列表类型中列出的元素类型外,您还可以使用 facets 来进一步限制列表类型的属性。表 34.3 “列表类型 Facets” 显示列表类型所使用的 facet。
facet | 效果 |
---|---|
| 定义列表类型的实例中元素数量。 |
| 定义列表类型实例中允许的最小元素数。 |
| 定义列表类型实例中允许的最大元素数。 |
| 定义列表类型实例中元素的允许值。 |
| 定义列表类型实例中元素的字典形式。使用正则表达式定义模式。 |
例如,例 34.7 “列出类型示例” 中显示的 simpleList
元素的定义。例 34.9 “列表类型的定义”
例 34.9. 列表类型的定义
<simpleType name="primeListType"> <list itemType="int"/> </simpleType> <element name="primeList" type="primeListType"/>
<simpleType name="primeListType">
<list itemType="int"/>
</simpleType>
<element name="primeList" type="primeListType"/>
除了 例 34.8 “XML 架构列表类型的语法” 中显示的语法外,您还可以使用 例 34.10 “列出类型的替代语法” 中显示的通用语法定义一个列表类型。
例 34.10. 列出类型的替代语法
<simpleType name="listType"> <list> <simpleType> <restriction base="atomicType"> <facet value="value"/> <facet value="value"/> ... </restriction> </simpleType> </list> </simpleType>
<simpleType name="listType">
<list>
<simpleType>
<restriction base="atomicType">
<facet value="value"/>
<facet value="value"/>
...
</restriction>
</simpleType>
</list>
</simpleType>
将列表类型元素映射到 Java
当元素定义列表类型时,list 类型映射到集合属性。collection 属性是一个 Java List<T>
对象。List<T>
使用的模板类是从列表的基本类型映射的 wrapper 类。例如: 例 34.9 “列表类型的定义” 中定义的列表类型映射到 List<Integer>
。
有关打包程序类型映射的详情,请参考 “wrapper 类”一节。
将列表类型参数映射到 Java
当消息部分定义为列表类型或映射到列表类型的元素时,生成的 method 参数映射到数组而不是 List<T>
; 对象。数组的基本类型是列表类型的基本类。
例如,例 34.11 “带有 List Type Message Part 的 WSDL” 中的 WSDL 片段生成方法签名,如 例 34.12 “带有 List Type 参数的 Java 方法” 所示。
例 34.11. 带有 List Type Message Part 的 WSDL
<definitions ...> ... <types ...> <schema ... > <simpleType name="primeListType"> <list itemType="int"/> </simpleType> <element name="primeList" type="primeListType"/> </schemas> </types> <message name="numRequest"> <part name="inputData" element="xsd1:primeList" /> </message> <message name="numResponse">; <part name="outputData" type="xsd:int"> ... <portType name="numberService"> <operation name="primeProcessor"> <input name="numRequest" message="tns:numRequest" /> <output name="numResponse" message="tns:numResponse" /> </operation> ... </portType> ... </definitions>
<definitions ...>
...
<types ...>
<schema ... >
<simpleType name="primeListType">
<list itemType="int"/>
</simpleType>
<element name="primeList" type="primeListType"/>
</schemas>
</types>
<message name="numRequest"> <part name="inputData" element="xsd1:primeList" /> </message>
<message name="numResponse">;
<part name="outputData" type="xsd:int">
...
<portType name="numberService">
<operation name="primeProcessor">
<input name="numRequest" message="tns:numRequest" />
<output name="numResponse" message="tns:numResponse" />
</operation>
...
</portType>
...
</definitions>
例 34.12. 带有 List Type 参数的 Java 方法
public interface NumberService { @XmlList @WebResult(name = "outputData", targetNamespace = "", partName = "outputData") @WebMethod public int primeProcessor( @WebParam(partName = "inputData", name = "primeList", targetNamespace = "...") java.lang.Integer[] inputData ); }
public interface NumberService {
@XmlList
@WebResult(name = "outputData", targetNamespace = "", partName = "outputData")
@WebMethod
public int primeProcessor(
@WebParam(partName = "inputData", name = "primeList", targetNamespace = "...") java.lang.Integer[] inputData
);
}