.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
相关产品推荐
相关产品推荐

