2010-07-01 60 views

回答

3

不是我所知道的,而是看看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

3

我剛建立了一個非常簡單的應該做的伎倆。

<#@ 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(); 
     } 
    } 
#>