.NET 6下如何将XSD编译进程序生成XmlSchemaSet验证XML?
解决.NET 6中嵌入XSD并验证XML的方案
推荐方案:将XSD作为嵌入资源加载
这是最简便且易维护的方案,无需手动编写XmlSchemaSet相关代码,XSD更新时只需替换嵌入资源即可:
步骤1:配置XSD文件属性
将XSD文件添加到项目后,在属性面板设置:- 生成操作:嵌入的资源
- 复制到输出目录:不复制
步骤2:运行时从资源加载XSD到XmlSchemaSet
通过程序集的嵌入资源流读取XSD,避免磁盘IO:
using System.Reflection; using System.Xml; using System.Xml.Schema; // 初始化Schema集合 var schemaSet = new XmlSchemaSet(); // 获取嵌入资源的流(注意命名格式:项目默认命名空间 + 文件路径,比如项目命名为DataTransfer,XSD在Schemas文件夹下则为DataTransfer.Schemas.GovSchema.xsd) var resourceName = "YourProjectNamespace.Path.To.YourSchema.xsd"; using var schemaStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName); if (schemaStream == null) { throw new InvalidOperationException($"未找到嵌入的XSD资源:{resourceName}"); } // 将Schema加载到集合中 schemaSet.Add(null, XmlReader.Create(schemaStream));
- 步骤3:使用XmlSchemaSet验证XML
配置XmlReaderSettings进行验证,验证不通过时抛出异常:
// 配置XML读取器的验证规则 var xmlSettings = new XmlReaderSettings { Schemas = schemaSet, ValidationType = ValidationType.Schema, // 可选:开启警告报告、处理内联Schema等 ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings | XmlSchemaValidationFlags.ProcessInlineSchema | XmlSchemaValidationFlags.ProcessSchemaLocation }; // 绑定验证事件处理程序,捕获错误 xmlSettings.ValidationEventHandler += (sender, e) => { if (e.Severity == XmlSeverityType.Error) { throw new XmlSchemaValidationException($"XML验证失败:{e.Message}", e.Exception); } }; // 读取XML并触发验证(这里以字符串为例,也可从文件/流读取) var xmlContent = "你的客户提供的XML内容"; using var xmlReader = XmlReader.Create(new StringReader(xmlContent), xmlSettings); // 遍历XML内容触发验证 while (xmlReader.Read()) { }
- 步骤4:验证通过后导入到应用程序对象
直接用XmlSerializer反序列化到之前通过xsd.exe生成的类:
using System.Xml.Serialization; var serializer = new XmlSerializer(typeof(YourGeneratedClass)); using var xmlReader = XmlReader.Create(new StringReader(xmlContent)); var appDataObject = (YourGeneratedClass)serializer.Deserialize(xmlReader);
备选方案:生成XmlSchemaSet初始化代码
目前没有官方工具可以直接将XSD转换为创建XmlSchemaSet的代码,手动编写不仅耗时还容易出错,且XSD更新时需要重复维护。如果确实需要生成代码,可以自行编写一个小工具:
- 运行时加载XSD到XmlSchemaSet
- 遍历XmlSchemaSet中的Schema、元素、属性等结构
- 自动生成对应的C#初始化代码
但这种方案维护成本远高于嵌入资源方案,不推荐使用。
内容的提问来源于stack exchange,提问作者Jimbo1999
相关产品推荐
相关产品推荐

