XmlSchemaSet 是 .NET 中编译、验证和缓存 XSD 的核心类,支持多模式合并、依赖解析与线程安全复用;需手动添加所有 import/include 的 Schema 并调用 Compile(),配合 ValidationEventHandler 可调试错误。

XmlSchemaSet 是 .NET 中用于编译、验证和缓存 XML Schema(XSD)的核心类。它替代了已过时的 XmlSchemaCollection,支持多模式合并、重复定义检测、命名空间隔离,并能高效复用已编译的 Schema。
加载并编译单个 XSD 文件
最常见场景是读取本地 .xsd 文件,编译成可验证的内部表示:
- 创建
XmlSchemaSet实例(可指定XmlNameTable优化性能) - 调用
Add()方法传入目标命名空间和文件路径(或XmlReader) - 调用
Compile()—— 此步真正解析语法、检查约束、构建验证模型
示例:
var schemas = new XmlSchemaSet();
schemas.Add("http://example.com/order", "order.xsd"); // 命名空间必须匹配 targetNamespace
schemas.Compile(); // 编译失败会抛出 XmlSchemaException
编译多个关联的 XSD(含 import/include/redefine)
XmlSchemaSet 自动处理 、 和 ,前提是所有被引用的 Schema 都已加入集合中:
- 先添加被依赖的 Schema(如公共类型库),再添加引用它的主 Schema
- 命名空间必须严格匹配
targetNamespace,否则import无法解析 -
Compile()会递归解析全部依赖,发现循环引用或缺失文件时抛异常
注意:不支持从 HTTP URL 自动下载远程 schemaLocation,需手动加载并 Add 所有依赖项。
缓存与复用已编译 Schema
编译后的 XmlSchemaSet 是线程安全的,可全局共享,避免重复编译开销:
- 推荐作为静态字段或 DI 容器单例管理
- 后续验证时直接传给
XmlReaderSettings.Schemas即可复用 - 若需动态更新(如热重载 XSD),应新建
XmlSchemaSet并替换旧实例,避免并发修改问题
验证示例:
var settings = new XmlReaderSettings { Schemas = schemas };
settings.ValidationType = ValidationType.Schema;
using var reader = XmlReader.Create("order.xml", settings);
while (reader.Read()) { } // 触发验证
调试编译错误与自定义验证回调
编译或验证失败时,默认只抛异常。可通过 ValidationEventHandler 捕获详细信息:
- 在
Add()前或Compile()前设置schemas.ValidationEventHandler - 事件参数
ValidationEventArgs包含错误级别(Warning/ Error)、消息、源文件和行号 - 对 warning 可选择忽略,error 则通常中断流程
示例:
schemas.ValidationEventHandler += (sender, e) =>
{
Console.WriteLine($"{e.Severity}: {e.Message} at {e.Exception?.LineNumber}");
};










