2016-04-08 4 views
1

xpathを使用して脆弱なコードを持つことができるように、XMLテンプレートからいくつかのC#クラスを生成するものが既にあるのだろうか?XPathを構築するためのXMLテンプレートからクラスを生成

代わりに生成されたクラス

誰かがXMLテンプレートのようなものを使用した場合、私は好奇心のasp.net MVCにおけるコントローラのようなものを、使用Cat.Noeud.KeyからXPATH "/cat/noeud/key"構築XPathを持つの?

[EDIT]

私は私の質問に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.xmlからMyObject.csを発生させるために、私はこのコウモリのスクリプトを実行します。

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" 

これは、Microsoft SDKが提供するXSDプログラムを実行します.xmlファイルに保存します。 XSDは.xsdファイルを生成します。 XSDを新しい.xsdファイルで再度実行すると、.csファイルが作成されます。すべて同じ名前です。スクリプトは、.csファイルをSDKフォルダからプロジェクトにコピーします。

これで、xml文書に基づいて.csの厳密に型指定されたファイルが作成されました。あなたは今、このようなあなたの.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> 

...

を私は「[XMLファイル」変数が結ばれている.ttファイルオフコードを生成するために、私のT4ソリューションを実行するにはTextTemplatingSessionクラスに追加します。これは、その後、私は(MyOtherObject.xml、customer.xmlを、など)たいものは何でもMyObject.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"のようなもので、この設定では動作しません。

希望すると便利です。

関連する問題