如何通过C#代码(非VS界面/命令行)从XML文件生成C#类?求NuGet方案
通过C#代码实现XML到C#类的转换(无需VS界面/命令行)
要直接用C#代码完成XML到C#类的生成,以下是几个实用的NuGet包及具体实现方案:
1. XmlToCSharp
这个包可以直接从XML字符串生成C#类代码,无需中转XSD,适合简单XML场景。
安装包
在项目中执行NuGet安装命令:
Install-Package XmlToCSharp
代码示例
using XmlToCSharp; using System.IO; // 待转换的XML内容 string xmlContent = @"<?xml version=""1.0"" encoding=""utf-8"" ?> <Person> <Id>3344</Id> <Name>Ahmed Shaikoun</Name> <Title>Software Engineer</Title> <Country>Egypt</Country> <Phone>0xx-xxxxxxxxx</Phone> </Person>"; // 生成指定类名的C#代码 string classCode = XmlConverter.ConvertXmlToCSharp(xmlContent, "Person"); // 将代码写入文件(也可直接在内存中使用) File.WriteAllText("Person.cs", classCode);
生成的类会自动带上XmlSerializer所需的特性,示例输出:
using System.Xml.Serialization; [XmlRoot(ElementName="Person")] public class Person { [XmlElement(ElementName="Id")] public string Id { get; set; } [XmlElement(ElementName="Name")] public string Name { get; set; } [XmlElement(ElementName="Title")] public string Title { get; set; } [XmlElement(ElementName="Country")] public string Country { get; set; } [XmlElement(ElementName="Phone")] public string Phone { get; set; } }
2. Xsd2Code.Core
如果需要更灵活的配置(比如自定义序列化方式、生成数据注解、选择集合类型等),可以使用这个包。流程是先从XML推断出XSD,再基于XSD生成C#类。
安装包
Install-Package Xsd2Code.Core
代码示例
using System.Xml; using System.IO; using Xsd2Code.Library; using Xsd2Code.Library.Helpers; string xmlContent = @"<?xml version=""1.0"" encoding=""utf-8"" ?> <Person> <Id>3344</Id> <Name>Ahmed Shaikoun</Name> <Title>Software Engineer</Title> <Country>Egypt</Country> <Phone>0xx-xxxxxxxxx</Phone> </Person>"; // 第一步:从XML推断生成XSD XmlReader reader = XmlReader.Create(new StringReader(xmlContent)); XmlSchemaInference inference = new XmlSchemaInference(); XmlSchemaSet schemaSet = inference.InferSchema(reader); // 将XSD转为字符串 StringWriter xsdWriter = new StringWriter(); foreach (XmlSchema schema in schemaSet.Schemas()) { schema.Write(xsdWriter); } string xsdContent = xsdWriter.ToString(); // 第二步:配置生成参数 GeneratorParams genParams = new GeneratorParams(); genParams.ClassName = "Person"; genParams.TargetLanguage = Language.CSharp; genParams.Serializer = SerializerType.XmlSerializer; genParams.CollectionType = CollectionType.List; genParams.GenerateXMLAttributes = true; // 生成XML特性 // 生成C#类代码 string classCode = Generator.Generate(xsdContent, genParams); // 写入文件 File.WriteAllText("Person.cs", classCode);
这个包支持大量自定义选项,比如是否生成注释、是否启用可空类型、选择序列化框架(XmlSerializer/DataContractSerializer)等,适合复杂XML结构的转换。
3. 原生.NET实现(无第三方依赖)
如果不想引入NuGet包,也可以用.NET自带的System.Xml.Schema和System.CodeDom组件实现,不过代码相对繁琐,可控性有限。
代码示例
using System.CodeDom; using System.CodeDom.Compiler; using System.Xml; using System.Xml.Schema; using System.IO; using Microsoft.CSharp; string xmlContent = @"<?xml version=""1.0"" encoding=""utf-8"" ?> <Person> <Id>3344</Id> <Name>Ahmed Shaikoun</Name> <Title>Software Engineer</Title> <Country>Egypt</Country> <Phone>0xx-xxxxxxxxx</Phone> </Person>"; // 从XML推断XSD XmlReader reader = XmlReader.Create(new StringReader(xmlContent)); XmlSchemaInference inference = new XmlSchemaInference(); XmlSchemaSet schemaSet = inference.InferSchema(reader); // 导出XSD到CodeDom对象 CodeNamespace codeNamespace = new CodeNamespace("YourApp.Models"); XmlCodeExporter exporter = new XmlCodeExporter(codeNamespace); foreach (XmlSchema schema in schemaSet.Schemas()) { foreach (XmlSchemaObject schemaObj in schema.Items) { if (schemaObj is XmlSchemaElement element) { exporter.ExportElement(element, new CodeIdentifier("Person")); } } } // 生成C#代码 CodeCompileUnit compileUnit = new CodeCompileUnit(); compileUnit.Namespaces.Add(codeNamespace); CSharpCodeProvider codeProvider = new CSharpCodeProvider(); StringWriter codeWriter = new StringWriter(); codeProvider.GenerateCodeFromCompileUnit(compileUnit, codeWriter, new CodeGeneratorOptions()); string classCode = codeWriter.ToString(); File.WriteAllText("Person.cs", classCode);
内容的提问来源于stack exchange,提问作者Thai Quoc Toan K15 HCM
相关产品推荐
相关产品推荐

