XML是一种可扩展标记语言,本身仅负责描述数据的结构和内容,没有原生的数据类型系统,需要通过额外的规范来定义数据类型,以此约束XML文档中元素和属性的值格式,保证数据的规范性。

通过DTD定义数据类型
DTD即文档类型定义,是早期用于约束XML文档结构的规范,它支持定义元素和属性的基本类型,不过类型种类较少,能力相对有限。
属性类型定义
DTD中可以通过<!ATTLIST>声明来定义属性的数据类型,常见的属性类型包括CDATA(字符数据)、Enumerated(枚举类型)、ID(唯一标识)等。
以下是一个DTD属性类型定义的示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user [
<!ELEMENT user (name, age, gender)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT gender (#PCDATA)>
<!ATTLIST user id ID #REQUIRED>
<!ATTLIST gender type (male|female) "male">
]>
<user id="u1">
<name>张三</name>
<age>25</age>
<gender type="male">男</gender>
</user>
上述示例中,id属性被定义为ID类型,要求值在整个文档中唯一;gender元素的type属性被定义为枚举类型,只能取male或female两个值。
元素内容类型定义
DTD中元素的内容类型主要通过<!ELEMENT>声明定义,常见的包括#PCDATA(可解析的字符数据)、EMPTY(空元素)、ANY(任意内容)等,不过无法对字符数据的具体格式做更细致的限制。
通过XML Schema定义数据类型
XML Schema(XSD)是比DTD更现代、更强大的XML约束规范,提供了丰富的数据类型体系,支持内置数据类型和自定义复杂数据类型,是目前定义XML数据类型的主流方式。
内置数据类型
XML Schema内置了大量常用的数据类型,覆盖了大部分业务场景的需求,常见的内置类型如下:
| 类型名称 | 说明 | 示例值 |
|---|---|---|
| string | 字符串类型 | hello world |
| integer | 整数类型 | 100 |
| decimal | 十进制数值类型 | 3.14 |
| boolean | 布尔类型 | true、false、1、0 |
| date | 日期类型 | 2024-05-20 |
| dateTime | 日期时间类型 | 2024-05-20T14:30:00 |
自定义简单类型
如果内置类型无法满足需求,可以通过<simpleType>标签自定义简单类型,比如限制字符串的长度、数值的范围、定义枚举值等。
以下是一个自定义简单类型的示例,定义了一个年龄类型,要求取值为1到120之间的整数:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="ageType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="ageType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
自定义复杂类型
复杂类型用于定义包含子元素或属性的元素结构,通过<complexType>标签定义,可以组合多个子元素和属性,构建复杂的数据结构。
以下是一个自定义复杂类型的示例,定义了一个包含子元素和属性的用户信息类型:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="userType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element name="registerDate" type="xs:date"/>
</xs:sequence>
<xs:attribute name="userId" type="xs:integer" use="required"/>
</xs:complexType>
<xs:element name="user" type="userType"/>
</xs:schema>
两种定义方式的对比
- DTD语法简单,兼容性好,但是数据类型种类少,无法做细致的格式约束,也不支持命名空间。
- XML Schema数据类型丰富,支持自定义类型,约束能力强,支持命名空间,但是语法相对复杂,学习成本更高。
在实际开发中,如果需要简单的XML结构约束,可以选择DTD;如果需要对数据类型做严格规范,尤其是涉及复杂数据结构或跨系统数据交换的场景,推荐使用XML Schema来定义数据类型。
XML数据类型XML_SchemaDTD数据类型定义修改时间:2026-06-21 12:15:31