xsd 是 xml 模式定义文件,用标准 xml 语法描述元素、属性、数据类型、嵌套结构等规则,支持命名空间、强数据类型和断言,需通过编程、命令行等方式验证 xml 是否符合其约束。

XSD 是 XML Schema Definition 的缩写,即 XML 模式定义文件。它用标准 XML 语法描述一个 XML 文档允许包含哪些元素、属性、数据类型、嵌套结构、出现次数、取值范围等规则。相比老式的 DTD,XSD 支持更强的数据类型(如 xs:date、xs:decimal)、命名空间、可扩展性,并能被现代开发工具和框架直接解析和校验。
什么是 XSD 文件
XSD 文件本身是合法的 XML 文本,根元素必须是 xs:schema(通常带 xmlns:xs 命名空间声明)。它通过以下方式约束 XML:
- 定义元素名称、是否必需、最多/最少出现几次(minOccurs/maxOccurs)
- 指定元素内容类型:简单类型(如字符串、整数、正则匹配的邮箱)或复杂类型(含子元素和属性)
- 限制值范围:例如用 xs:minInclusive 要求年龄 ≥ 0,用 xs:pattern 要求手机号符合 1[3-9]\d{9}
- 支持断言(xs:assert):在 XSD 1.1 中可写逻辑表达式,比如 “当 status='active' 时,expiryDate 必须存在”
如何用 XSD 验证 XML 文件
验证就是检查某个 XML 文件是否完全满足 XSD 中定义的所有结构与值约束。常用方法有三类:
- 编程验证(.NET):使用 System.Xml.Schema.XmlSchemaSet 加载 XSD,再调用 XmlDocument.Validate(),错误会通过 ValidationEventHandler 回调返回
- 编程验证(Java):用 javax.xml.validation.Validator 和 SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI) 创建校验器,传入 XML Source 即可
- 命令行工具(Linux/macOS):安装 xmllint 后执行 xmllint --schema schema.xsd data.xml --noout;或用 Apache Xerces 的 SAXCount -f -s -n data.xml
验证前要注意什么
不是所有 XSD 都能直接拿来验证,需确认几点:
- XSD 文件本身语法正确(可用在线 XSD 校验器或 IDE 如 VS Code + XML 插件预检)
- XML 文件开头的 xmlns 或 xsi:schemaLocation 声明,要与 XSD 中的 targetNamespace 一致(否则可能跳过校验)
- 如果 XSD 引用了其他 XSD(通过 xs:include 或 xs:import),确保路径可访问,或提前合并/预加载全部依赖
- 注意版本:xs:assert 等高级特性仅在 XSD 1.1 支持,而 .NET Framework 默认只支持 1.0,需升级到 .NET Core/.NET 5+ 并启用 XSD 1.1 支持
一个最小可运行示例
假设你有如下 XSD(person.xsd):
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:positiveInteger"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
对应合法 XML(person.xml)应为:
<?xml version="1.0"?> <person> <name>Alice</name> <age>28</age> </person>
若把 age 改成 -5 或 "abc",验证就会报错:“The value '-5' is not valid according to its datatype…”










