2016-04-08 38 views
1

Xpath kullanarak daha az kırılgan bir kod oluşturabilmek için XML şablonundan bazı C# sınıfı üreten bir şey olup olmadığını merak ediyorum?XPath oluşturmak için Xml şablonundan sınıf oluştur

yerine oluşturulan sınıflar

birisi xml şablonları için böyle bir şey kullanılırsa ben merak asp.net mvc içinde denetleyicisi için bu gibi şeyler, kullanılan Cat.Noeud.Key bir XPath "/cat/noeud/key" bina xpath sahip?

[DÜZENLE]

, amaç bir değişiklik de varsa sırayla her recompilation sonra rejenere edilecek bir T4.tt, sahip olmaktır Sorumun T4 etiketi vardı ama özenli vermedi xml şablonu bir derleme hatasımız olacak

cevap

1

Bir XML tanımından sınıflar oluşturmak istiyorsanız, xsd.exe (link) adlı araca bakın.

XML'inizi temsil eden bir Xml Şeması (.xsd dosyası, link here) tanımladığınız sürece, xsd.exe bu XML Şemasıyla eşleşen sınıfları oluşturmak için kullanılabilir.

Böyle bir sınıfın örneği, serileştirildiğinde (XML olarak) bu örneğin bir XML temsiliyle sonuçlanır. (Sınıfları oluştururken kullanılan XML şemasına uygun).

0

Geekiod'dan bahsettiğim gibi XSD kullanıyorum. İşte benim T4 kurulumum:

Benim T4 çözümümde MyObject.xml dosyası var. Bu, Microsoft SDK tarafından sağlanan XSD programını çalıştıran

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" 

: (i MyObject.xml şema değişiklik yaptığınızda veya güncelleme)

bu bat komut dosyasını çalıştırmak MyObject.xml gelen MyObject.cs oluşturmak için .xml dosyanızda. XSD bir .xsd dosyası oluşturur. XSD'yi yeni .xsd dosyasında tekrar çalıştırın ve .cs dosyanızı oluşturacaksınız. Hepsi aynı ada sahip. Komut dosyası daha sonra .cs dosyasını SDK klasöründen tekrar projeme kopyalar.

Artık xml belgenizi temel alan .cs güçlü yazdığınız bir dosya var. Artık bu gibi .tt dosyalarında güzel şeyler yapabiliriz:

<#@ 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> 

...

ben "XmlFileName" değişken bağlı olan .tt dosyaları kapalı kod oluşturmak için benim T4 çözümünü çalıştırmak için TextTemplatingSession sınıfına.

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); 
      } 

bu son parçası "özel Aracı" değiştirmeniz gerekir ise: Bu da bana (MyOtherObject.xml, Customer.xml, vs) istediği kadar MyObject.xml dosyası işaret sağlar .tt dosya özelliklerinden "TextTemplatingFilePreprocessor" seçeneğine. Varsayılan, bu kurulumla çalışmayan "TextTemplatingGenerator" gibi bir şeydir.

Bu yardımcı olur umarız!