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

.NET Core中如何以编程方式将Schema转换为C#类?

在.NET Core中编程实现XML Schema转C#类

针对你的需求,以下是几种可行的编程实现方案,替代.NET Framework中的XmlCodeExporter:

方案1:使用原生XmlSchemaImporter + CodeDom

.NET Core中XmlCodeExporter虽被标记为过时但仍可使用,结合XmlSchemaImporter和CodeDom可以实现原生的代码生成,需要引用System.CodeDom和System.Xml.Serialization相关API,另外可通过NuGet安装Microsoft.CodeDom.Providers.DotNetCompilerPlatform来支持C#代码生成。

示例代码

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO;
using System.Xml.Schema;
using System.Xml.Serialization;
using Microsoft.CSharp;

public class XsdToClassGenerator
{
    public string GenerateCSharpClassFromXsd(string xsdFilePath)
    {
        // 加载并编译Schema
        XmlSchemaSet schemaSet = new XmlSchemaSet();
        schemaSet.Add(null, xsdFilePath);
        schemaSet.Compile();

        XmlSchema targetSchema = null;
        foreach (XmlSchema schema in schemaSet.Schemas())
        {
            targetSchema = schema;
            break;
        }

        if (targetSchema == null)
            throw new InvalidOperationException("未能加载目标XML Schema");

        // 准备CodeDom命名空间
        CodeNamespace codeNs = new CodeNamespace("GeneratedClasses");
        XmlSchemaImporter importer = new XmlSchemaImporter(schemaSet);
        CodeCompileUnit compileUnit = new CodeCompileUnit();
        compileUnit.Namespaces.Add(codeNs);

        // 遍历Schema中的元素并生成对应类
        foreach (XmlSchemaElement element in targetSchema.Elements.Values)
        {
            XmlTypeMapping typeMapping = importer.ImportTypeMapping(element.QualifiedName);
            XmlCodeExporter exporter = new XmlCodeExporter(codeNs);
            exporter.ExportTypeMapping(typeMapping);
        }

        // 生成C#代码文本
        using (StringWriter writer = new StringWriter())
        {
            CodeDomProvider csProvider = CodeDomProvider.CreateProvider("CSharp");
            CodeGeneratorOptions options = new CodeGeneratorOptions
            {
                BracingStyle = "C",
                BlankLinesBetweenMembers = true
            };
            csProvider.GenerateCodeFromCompileUnit(compileUnit, writer, options);
            return writer.ToString();
        }
    }
}

方案2:编程调用xsd.exe命令行

如果可以依赖.NET Framework的xsd.exe工具(通常位于.NET SDK安装目录),可以通过Process类直接调用命令行生成代码,效果和手动执行xsd.exe Schema.xsd /c完全一致。

示例代码

using System.Diagnostics;
using System.IO;

public class XsdToolInvoker
{
    public void GenerateClassViaXsdExe(string xsdFilePath, string outputDirectory)
    {
        // 替换为你本地的xsd.exe路径,不同.NET Framework版本路径略有差异
        string xsdExePath = @"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\xsd.exe";

        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            FileName = xsdExePath,
            Arguments = $"\"{xsdFilePath}\" /c /out:\"{outputDirectory}\"",
            UseShellExecute = false,
            RedirectStandardOutput = true,
            CreateNoWindow = true
        };

        using (Process process = Process.Start(startInfo))
        {
            process.WaitForExit();
            string output = process.StandardOutput.ReadToEnd();
            if (process.ExitCode != 0)
                throw new InvalidOperationException($"代码生成失败:{output}");
        }
    }
}

方案3:使用第三方库Xsd2CodeCore

Xsd2CodeCore是.NET Core移植版的Xsd2Code,提供了封装好的代码生成API,使用起来更简洁,需要先安装NuGet包Xsd2CodeCore。

示例代码

using Xsd2Code;

public class Xsd2CodeGenerator
{
    public string GenerateCSharpClass(string xsdFilePath)
    {
        GeneratorParams genParams = new GeneratorParams
        {
            Language = Language.CSharp,
            Namespace = "GeneratedClasses",
            GenerateXMLAttributes = true,
            CollectionType = CollectionType.List,
            EnableDataBinding = false
        };

        return Generator.Generate(xsdFilePath, genParams);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:40:37