是否有可用于从xsd生成c#类的T4模板?

问题描述:

是否有T4模板可用于从xsd生成c#类?是否有可用于从xsd生成c#类的T4模板?

不是我所知道的,而是看看LINQ to XSD(http://linqtoxsd.codeplex.com/)。您可以使用LinqToXsd.exe根据您的模式生成强类型类。然后你也有完整的LINQ支持。非常便利。

您也可以设置,看起来像在您的项目预生成事件:

"$(ProjectDir)Lib/LinqToXsd/LinqToXsd.Exe" "$(ProjectDir)MySchema.xsd" /fileName:MySchema.cs

这将产生从架构的类你建立正确的之前,所以如果你改变架构中,您的类将与每个构建保持同步。

+0

不错,不知道。比预建步骤要好得多。 – 2010-07-01 23:39:21

+1

您也可以在解决方案资源管理器中使用XSD文件的Build Action属性,并将其设置为LinqToXsdSchema(这要求您设置项目以导入LinqToXsd.targets) – 2010-07-01 23:41:02

我刚建立了一个非常简单的应该做的伎俩。

<#@ template debug="true" hostSpecific="true" #> 
<#@ Assembly Name="System.Core.dll" #> 
<#@ Assembly Name="System.Windows.Forms.dll" #> 
<#@ Assembly Name="System.Xml" #> 
<#@ Assembly Name="Microsoft.CSharp" #> 
<#@ output extension=".txt" #> 
<#@ import namespace="System" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Text" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="System.Reflection" #> 
<#@ import namespace="System.Xml" #> 
<#@ import namespace="System.Xml.Serialization" #> 
<#@ import namespace="System.Xml.Schema" #> 
<#@ import namespace="System.CodeDom" #> 
<#@ import namespace="System.CodeDom.Compiler" #> 
<#@ import namespace="Microsoft.CSharp" #> 
<# 
    // directory of this template 
    var outputDirectory = Path.GetDirectoryName(Host.TemplateFile); 

    // iterate through each XSD file in our /Schema/ directory 
    // and output the generated C# file in this directory. 
    foreach(var file in new DirectoryInfo(Host.ResolvePath("Schemas")).GetFiles("*.xsd")) { 

     // ouput file should be the directory of this template, with .Generated.cs 
     var outputFile = Path.Combine(outputDirectory, file.Name.Replace(".xsd", ".Generated.cs")); 

     // do it 
     File.WriteAllText(outputFile, GenerateFromXsd(file.FullName)); 
    } 
#> 
<#+ 
    private string GenerateFromXsd(string xsdFileName) 
    { 
     // load the xsd 
     XmlSchema xsd; 
     using (FileStream stream = new FileStream(xsdFileName, FileMode.Open, FileAccess.Read)) 
     { 
      xsd = XmlSchema.Read(stream, null); 
     } 

     var xsds = new XmlSchemas(); 
     xsds.Add(xsd); 
     xsds.Compile(null, true); 

     var schemaImporter = new XmlSchemaImporter(xsds); 

     // create the codedom 
     var codeNamespace = new CodeNamespace((string)System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint")); 
     var codeExporter = new XmlCodeExporter(codeNamespace); 

     var maps = new List<object>(); 
     foreach (XmlSchemaType schemaType in xsd.SchemaTypes.Values) 
     { 
      maps.Add(schemaImporter.ImportSchemaType(schemaType.QualifiedName)); 
     } 
     foreach (XmlSchemaElement schemaElement in xsd.Elements.Values) 
     { 
      maps.Add(schemaImporter.ImportTypeMapping(schemaElement.QualifiedName)); 
     } 
     foreach (XmlTypeMapping map in maps) 
     { 
      codeExporter.ExportTypeMapping(map); 
     } 

     // Check for invalid characters in identifiers 
     CodeGenerator.ValidateIdentifiers(codeNamespace); 

     // output the C# code 
     var codeProvider = new CSharpCodeProvider(); 

     using (var writer = new StringWriter()) 
     { 
      codeProvider.GenerateCodeFromNamespace(codeNamespace, writer, new CodeGeneratorOptions()); 
      return writer.GetStringBuilder().ToString(); 
     } 
    } 
#>