是否有可用于从xsd生成c#类的T4模板?
是否有可用于从xsd生成c#类的T4模板?
不是我所知道的,而是看一下LINQ to XSD( http://linqtoxsd.codeplex.com/ )。 您可以使用LinqToXsd.exe根据您的架构生成强类型类。 然后你也有完整的LINQ支持。 非常便利。
您还可以在项目上设置一个类似于以下内容的预构建事件:
"$(ProjectDir)Lib/LinqToXsd/LinqToXsd.Exe" "$(ProjectDir)MySchema.xsd" /fileName:MySchema.cs
这将在您构建之前从架构生成类,因此如果您更改架构,您的类将与每个构建保持同步。
我今天刚刚构建了一个非常简单的应该可以解决的问题。
<#@ 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