在XML Schema(XSD)的定义中,xs:union是用于合并多种简单数据类型的核心元素,它允许开发者定义一个联合类型,该类型的值可以匹配联合中任意一个成员类型的定义。通过这种方式,单个XML元素或属性就可以支持多种不同的数据类型,大幅提升Schema定义的灵活性。

xs:union的基本语法
xs:union必须作为xs:simpleType的子元素使用,它有两种定义成员类型的方式,一种是通过memberTypes属性直接引用已定义的简单类型,另一种是在xs:union内部嵌套定义多个匿名简单类型。
基础语法结构如下:
<xs:simpleType name="联合类型名称">
<xs:union memberTypes="类型1 类型2 ...">
<!-- 可选:嵌套定义匿名简单类型 -->
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="自定义正则"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
其中memberTypes属性的值是一个由空格分隔的类型名称列表,这些类型必须是已经定义的简单类型,或者是XSD内置的简单类型。
xs:union的核心属性
xs:union只有一个核心属性memberTypes,具体说明如下:
| 属性名 | 说明 | 是否必填 |
|---|---|---|
| memberTypes | 指定联合类型包含的成员类型列表,多个类型之间用空格分隔,可以是内置类型或自定义简单类型 | 否,如果不设置该属性,则必须在xs:union内部嵌套定义至少一个匿名简单类型 |
xs:union使用示例
示例1:合并内置简单类型
假设我们需要定义一个user_id元素,它的值既可以是整数类型,也可以是字符串类型,就可以使用xs:union合并xs:integer和xs:string两种内置类型。
首先定义联合类型:
<xs:simpleType name="userIdType"> <xs:union memberTypes="xs:integer xs:string"/> </xs:simpleType>
然后在元素定义中引用该联合类型:
<xs:element name="user_id" type="userIdType"/>
此时以下两种XML内容都是合法的:
<user_id>1001</user_id> <user_id>user_1001</user_id>
示例2:合并自定义简单类型
如果内置类型无法满足需求,也可以先定义自定义简单类型,再将其合并到联合类型中。比如我们需要定义一个score元素,值可以是0到100的整数,或者是优秀、良好、及格、不及格这几个枚举值。
先定义两个自定义简单类型:
<!-- 0到100的整数类型 -->
<xs:simpleType name="numScoreType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
<!-- 等级枚举类型 -->
<xs:simpleType name="levelScoreType">
<xs:restriction base="xs:string">
<xs:enumeration value="优秀"/>
<xs:enumeration value="良好"/>
<xs:enumeration value="及格"/>
<xs:enumeration value="不及格"/>
</xs:restriction>
</xs:simpleType>
再定义联合类型并引用:
<xs:simpleType name="scoreType"> <xs:union memberTypes="numScoreType levelScoreType"/> </xs:simpleType> <xs:element name="score" type="scoreType"/>
此时以下XML内容都是合法的:
<score>95</score> <score>良好</score>
示例3:使用嵌套匿名类型
如果不想单独定义成员类型,也可以在xs:union内部直接嵌套匿名简单类型,比如定义一个既可以是整数,也可以是邮箱格式的字符串的联合类型:
<xs:simpleType name="contactType">
<xs:union memberTypes="xs:integer">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
<xs:element name="contact" type="contactType"/>
此时contact元素的值可以是整数,也可以是符合邮箱格式的字符串。
校验规则与注意事项
- 当XML解析器校验联合类型的值时,会按照memberTypes中类型的顺序依次尝试匹配,只要匹配到任意一个类型,就认为该值合法,不会继续校验后续类型。
- xs:union只能合并简单类型,不能合并复杂类型,如果需要合并复杂类型,需要使用xs:choice元素。
- 联合类型的成员类型之间如果存在包含关系,比如同时包含xs:integer和xs:decimal,那么xs:integer会优先匹配,因为decimal包含integer的范围,顺序会影响匹配结果。
- 如果联合类型中的某个成员类型是列表类型,那么该联合类型的值也可以是对应列表类型的值。
常见使用场景
- 元素的值有多种可能的格式,比如日期可以是yyyy-MM-dd格式,也可以是时间戳整数。
- 兼容旧系统的数据类型定义,新Schema需要同时支持旧类型和新类型。
- 属性的值可以是多种类型,比如配置项的值既可以是布尔值,也可以是字符串说明。
xs:unionXSDXML_Schema数据类型合并修改时间:2026-06-25 02:39:27