You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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更新时需要重复维护。如果确实需要生成代码,可以自行编写一个小工具:

  1. 运行时加载XSD到XmlSchemaSet
  2. 遍历XmlSchemaSet中的Schema、元素、属性等结构
  3. 自动生成对应的C#初始化代码

但这种方案维护成本远高于嵌入资源方案,不推荐使用。

内容的提问来源于stack exchange,提问作者Jimbo1999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:43:25