XSD即XML Schema Definition,是W3C制定的用于定义XML文档结构、内容和数据类型的规范,通过XSD可以对XML中的元素、属性以及它们的值类型做出明确约束,保证XML数据的规范性和一致性。XSD的数据类型定义体系分为内置数据类型和自定义数据类型两大类别,覆盖了大部分业务场景的需求。

XSD内置数据类型
XSD提供了一系列开箱即用的内置数据类型,不需要额外定义就可以直接在元素或属性中引用,常见的内置类型可以分为以下几类:
基础标量类型
- xs:string:字符串类型,用于定义文本类数据,默认不会做内容校验,所有字符都可以存储。
- xs:integer:整数类型,只能存储整数数值,不包含小数部分。
- xs:decimal:十进制数字类型,支持存储带小数的数值,精度可以根据需求调整。
- xs:boolean:布尔类型,合法值为true、false、1、0。
- xs:date:日期类型,格式要求为YYYY-MM-DD,比如2024-05-20。
- xs:dateTime:日期时间类型,格式为YYYY-MM-DDThh:mm:ss,比如2024-05-20T14:30:00。
内置类型使用示例
下面是一个简单的XSD片段,展示如何直接引用内置数据类型定义元素:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/user"
xmlns="http://www.example.org/user"
elementFormDefault="qualified">
<!-- 定义用户根元素,包含三个子元素 -->
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<!-- 用户名,字符串类型 -->
<xs:element name="username" type="xs:string"/>
<!-- 年龄,整数类型 -->
<xs:element name="age" type="xs:integer"/>
<!-- 注册时间,日期时间类型 -->
<xs:element name="registerTime" type="xs:dateTime"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
自定义简单类型
如果内置类型无法满足业务约束需求,比如需要限制字符串的长度、整数的取值范围,就可以通过xs:simpleType自定义简单类型,简单类型只能包含文本值,不能包含子元素或属性。
通过限制派生简单类型
最常用的自定义简单类型方式是基于已有内置类型做限制,使用xs:restriction标签,可配置的限制属性包括:
- minInclusive/maxInclusive:数值的最小值/最大值,包含边界值。
- minExclusive/maxExclusive:数值的最小值/最大值,不包含边界值。
- length/minLength/maxLength:字符串的长度限制。
- pattern:正则表达式,用于校验字符串格式,比如手机号、邮箱格式。
- enumeration:枚举值,限制值只能从指定的几个选项中选择。
下面是一个自定义简单类型的示例,定义性别类型只能取男或女,定义手机号类型必须符合大陆手机号格式:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ipipp.com/user"
xmlns="http://www.ipipp.com/user"
elementFormDefault="qualified">
<!-- 自定义性别简单类型,枚举值限制 -->
<xs:simpleType name="genderType">
<xs:restriction base="xs:string">
<xs:enumeration value="男"/>
<xs:enumeration value="女"/>
<xs:enumeration value="未知"/>
</xs:restriction>
</xs:simpleType>
<!-- 自定义手机号简单类型,正则限制 -->
<xs:simpleType name="phoneType">
<xs:restriction base="xs:string">
<xs:pattern value="1[3-9]d{9}"/>
<xs:minLength value="11"/>
<xs:maxLength value="11"/>
</xs:restriction>
</xs:simpleType>
<!-- 使用自定义简单类型 -->
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<xs:element name="gender" type="genderType"/>
<xs:element name="phone" type="phoneType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
自定义复杂类型
如果元素需要包含子元素、属性,或者同时包含文本和子元素,就需要定义复杂类型,使用xs:complexType标签。复杂类型可以组合多个子元素,也可以包含属性定义。
包含子元素的复杂类型
使用xs:sequence可以定义子元素的出现顺序,xs:choice定义多选一的子元素,xs:all定义无序的子元素集合。下面的示例定义一个订单复杂类型,包含订单号、商品列表、总金额三个子元素:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ipipp.com/order"
xmlns="http://www.ipipp.com/order"
elementFormDefault="qualified">
<!-- 自定义订单复杂类型 -->
<xs:complexType name="orderType">
<xs:sequence>
<!-- 订单号,字符串类型 -->
<xs:element name="orderNo" type="xs:string"/>
<!-- 商品列表,最少1个商品,最多无限制 -->
<xs:element name="product" type="xs:string" maxOccurs="unbounded" minOccurs="1"/>
<!-- 总金额,十进制数字类型 -->
<xs:element name="totalAmount" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
<!-- 定义订单根元素,类型为自定义订单复杂类型 -->
<xs:element name="order" type="orderType"/>
</xs:schema>
包含属性的复杂类型
复杂类型可以通过xs:attribute定义元素的属性,属性默认是可选的,设置use="required"可以设置为必填属性。下面的示例定义一个带属性的用户信息类型:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ipipp.com/user"
xmlns="http://www.ipipp.com/user"
elementFormDefault="qualified">
<!-- 带属性的用户复杂类型 -->
<xs:complexType name="userWithAttrType">
<xs:sequence>
<xs:element name="nickname" type="xs:string"/>
</xs:sequence>
<!-- 用户ID属性,必填 -->
<xs:attribute name="userId" type="xs:integer" use="required"/>
<!-- 用户等级属性,可选,默认值为1 -->
<xs:attribute name="level" type="xs:integer" default="1"/>
</xs:complexType>
<xs:element name="user" type="userWithAttrType"/>
</xs:schema>
复杂类型的扩展与限制
和简单类型类似,复杂类型也支持基于已有类型做扩展或限制。使用xs:extension可以在基础复杂类型上添加新的子元素或属性,使用xs:restriction可以限制基础复杂类型的子元素出现规则。
下面是一个扩展复杂类型的示例,基于基础用户类型添加新的邮箱子元素:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ipipp.com/user"
xmlns="http://www.ipipp.com/user"
elementFormDefault="qualified">
<!-- 基础用户复杂类型 -->
<xs:complexType name="baseUserType">
<xs:sequence>
<xs:element name="username" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<!-- 扩展用户复杂类型,新增邮箱子元素 -->
<xs:complexType name="extendedUserType">
<xs:complexContent>
<xs:extension base="baseUserType">
<xs:sequence>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="user" type="extendedUserType"/>
</xs:schema>
数据类型定义的注意事项
- 自定义类型定义时需要指定唯一的
name属性,之后才能在元素或属性中通过type属性引用。 - 简单类型不能包含子元素或属性,如果需要同时包含文本和属性,需要使用复杂类型,通过
xs:simpleContent实现。 - 定义元素时如果不指定
type属性,可以直接在元素内部嵌套xs:simpleType或xs:complexType做内联定义,不需要给类型单独命名。 - 命名空间需要正确配置,
targetNamespace指定当前XSD的命名空间,引用同命名空间下的自定义类型时不需要加前缀。
XSDXML_Schema数据类型定义修改时间:2026-07-05 09:03:18