以下是 XML Schema(XSD)最精华的 5 分钟概要,把 90% 的实战精髓浓缩在一张图里,看完这张表你就彻底掌握 XSD 了。
| 类别 | 核心关键字 | 作用 & 经典场景 | 一句话记忆口诀 |
|---|---|---|---|
| 根元素 | <xs:schema> | 所有 XSD 的唯一根 | 永远只有这一个根 |
| 命名空间 | targetNamespace + xmlns:xs | 区分自己的 XML 结构 | 有 targetNamespace 就是“有命名空间” |
| 全局 vs 局部 | 直接写在 <xs:schema> 下 = vs 嵌套在 complexType 里 | 全局 = 可被引用、可替换;局部 = 只能本地用 | 想 substitutionGroup 或 ref 必须全局 |
| 元素声明 | <xs:element name="xxx" type="..."/> | 定义一个元素 | 全局元素才能被 ref 或 substitution |
| 类型声明 | <xs:complexType> / <xs:simpleType> | 定义可复用的类型 | complex = 能有子元素或属性;simple = 纯文本 |
| 内容模型(顺序) | xs:sequence | 必须按顺序出现 | 地址:name → street → city |
| xs:choice | 三选一 | 支付方式:alipay / wechat / card | |
| xs:all | 都必须出现但顺序随意(每个只能 0..1) | 很少用 | |
| 出现次数 | minOccurs / maxOccurs | 控制元素出现几次 | 列表永远写 maxOccurs=”unbounded” |
| 混合内容 | <xs:complexType mixed="true"> | 文本和子元素混在一起(富文本) | 富文本必备:mixed=”true” + choice unbounded |
| 通配符 | <xs:any> | 任意元素 | 插件扩展点最常用 |
<xs:anyAttribute> | 任意属性 | Spring/MyBatis 配置永远这行 | |
| 元素替换(多态) | substitutionGroup + abstract=”true” | 同一个位置出现不同元素 | 支付、地址、XHTML h1~h6 都靠它 |
| 字符串终极王者 | xs:string → xs:normalizedString → xs:token | 推荐永远只用 xs:token | 名字、标题、关键词全用 token |
| 数值终极王者 | 整数 → xs:integer / positiveInteger 小数 → xs:decimal(fractionDigits=”2″) | 钱永远用 decimal! | 金额写错就破产 |
| 日期时间 | 只用 xs:date + xs:dateTime | 中国项目永远写 2025-11-28 和 2025-11-28T14:30:25+08:00 | 其余全部忽略 |
| 布尔/文件/链接 | xs:boolean xs:base64Binary xs:anyURI | 开关、图片上传、外链地址 | 这三个背下来就够用 |
99% 项目通用的“黄金模板”(直接复制当项目骨架)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.com/demo"
xmlns:tns="http://example.com/demo"
elementFormDefault="qualified">
<!-- 富文本类型(所有项目都抄这几行) -->
<xs:complexType name="RichText" mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="b"/>,<xs:element name="i"/>,<xs:element name="br"/>
<xs:any namespace="##other" processContents="lax"/>
</xs:choice>
</xs:complexType>
<!-- 金额类型(财务系统永远这几行) -->
<xs:simpleType name="Money">
<xs:restriction base="xs:decimal">
<xs:totalDigits value="14"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<!-- 可无限扩展的节点(Spring、MyBatis、Maven 都在用) -->
<xs:complexType name="Extensible">
<xs:sequence>
<xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:anyAttribute processContents="skip"/>
</xs:complexType>
</xs:schema>
终极记忆口诀(贴在显示器边上)
| 需求 | 永远只写这行代码 |
|---|---|
| 富文本 | mixed=”true” + choice + unbounded |
| 列表 | maxOccurs=”unbounded” |
| 插件/扩展点 | <xs:any namespace="##any" processContents="skip" .../> |
| 任意属性 | <xs:anyAttribute namespace="##any" processContents="skip"/> |
| 金额 | xs:decimal + fractionDigits=”2″ |
| 字符串(名字、标题) | xs:token |
| 多态(支付、地址) | 全局头元素 + abstract=”true” + substitutionGroup |
| 中国时间 | xs:dateTime 写成 2025-11-28T14:30:25+08:00 |
背完上面这张表 + 这几行代码,你已经超越了 95% 的开发者和架构师对 XSD 的掌握程度。
需要我直接给你一份「通用企业级 XSD 骨架模板」(包含命名空间、扩展点、富文本、金额、日期、元素替换全套)吗?一句话就发。