2016-04-08 69 views
1

我想知道是否已經有東西從XML模板生成一些c#類,以便能夠使用xpath使用較少的脆弱代碼?從Xml模板生成類來構建XPath

而不必從生成的類Cat.Noeud.Key

我用類似的東西爲控制器asp.net的MVC,好奇,如果有人用類似的東西爲XML模板的XPATH "/cat/noeud/key"建設的XPath?

[編輯]

我不得不T4標籤我的問題,但我沒有詳細闡述的,目的是爲了有一個T4.tt將每個重新編譯後再生,從而如果我們有一個變化xml模板我們將出現編譯錯誤

回答

1

如果您正在尋找從XML定義生成類,請查看稱爲xsd.exe的工具(link)。

如果您定義了表示XML的Xml架構(.xsd文件,link here),則可以使用xsd.exe生成與該XML架構匹配的類。

一個這樣的類的實例將在序列化(如XML)時導致該實例的XML表示。 (符合生成類時使用的XML模式)。

0

像Geekiod提到我使用XSD。這是我的T4設置:

我在我的T4解決方案中有MyObject.xml文件。

爲了從MyObject.xml MyObject.cs(或更新時,我更改了MyObject.xml模式)運行此腳本蝙蝠:

cd C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin 
xsd "C:\Users\XXXX\Documents\Visual Studio 2012\Projects\XXXXX.Templates\XXXXX.Templates.CodeGenerator\MyObject.xml" 
xsd "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\MyObject.xsd" /c 
xcopy /s "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\MyObject.cs" "C:\Users\XXXXX\Documents\Visual Studio 2012\Projects\XXXXX.Templates\XXXXXX.Templates.Common" 

這將運行由微軟SDK中提供的XSD計劃在您的.xml文件上。 XSD生成一個.xsd文件。您再次在新的.xsd文件上運行XSD,它將創建您的.cs文件。全部使用相同的名稱。然後該腳本將.cs文件從SDK文件夾複製回我的項目中。

現在,您的.cs強類型文件基於您的xml文檔。現在,你可以做很酷的東西在你.TT文件是這樣的:

<#@ parameter name="XmlFileName" type="System.String" #> 
<# 

    XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); 
    StreamReader sr = new StreamReader(this.XmlFileName); 
    MyObject O = (MyObject)serializer.Deserialize(sr); 

#> 
using System; 


public class <#= O.Name #> : BusinessObjectBase<<#= O.Name #>Data> 
    { 
     #region Construction 

     private <#= O.Name #>() : base(true) {} 

     /// <summary> 
     /// Initializes a new instance of the <#= Utility.GetRefClassName(O.Name) #> class. 
     /// </summary> 
     /// <param name="data"></param> 
     <#= Utility.GetRemarksComment2(O) #> 
     internal <#= O.Name #>(<#= O.Name #>Data data) : base(data) {} 

     #endregion 

     #region <#= O.Name #> Data 

     <# 
     // Generate a property for each child. 
     foreach (MyObjectProperty objProp in O.Property) 
     { 
      if (objProp.GetAccess == "public") 
      { 
       objProp.GetAccess = ""; 
      } 
      else 
      { 
       objProp.GetAccess = objProp.GetAccess + " "; 
      } 

      if (objProp.SetAccess == "public") 
      { 
       objProp.SetAccess = ""; 
      } 
      else 
      { 
       objProp.SetAccess = objProp.SetAccess + " "; 
      } 

     #>/// <summary> 

...

運行我的T4的解決方案來生成代碼關閉.TT文件,我已在「XmlFileName」變量綁到TextTemplatingSession類。這就讓我指向任何MyObject.xml文件,我想(MyOtherObject.xml,Customer.xml等):

static void RunThroughSession() 
     { 
      string objectName = "MyObject"; 

      var template = Activator.CreateInstance<BusinessObjectTemplate>(); 
      TextTemplatingSession session = new TextTemplatingSession(); 
      session["XmlFileName"] = 
       @"C:\Users\XXXXX\Documents\Visual Studio 2012\Projects\XXXXXX.Templates\XXXXXX.Templates.CodeGenerator\" + objectName + ".xml"; 

      template.Session = session; 
      template.Initialize(); 
      string outputText = template.TransformText(); 
      using (StreamWriter sr = new StreamWriter(
       @"C:\Users\XXXXX\Documents\Visual Studio 2012\Projects\XXXXX.Templates\XXXXXX.Templates.CodeGenerator\GeneratedCode\BusinessObject" + objectName + ".cs")) 
      { 
       sr.Write(outputText); 
      } 

的這最後一塊是你需要改變「自定義工具」選項從.tt文件屬性更改爲「TextTemplatingFilePreprocessor」。默認值就像「TextTemplatingGenerator」,它不適用於此設置。

希望這會有所幫助!