2016-04-08 27 views
1

Ich frage mich, ob es schon etwas gibt, das eine C# -Klasse aus der XML-Vorlage erzeugt, um einen weniger fragilen Code mit xpath zu haben?Generiere Klasse von Xml Vorlage um XPath zu erstellen

Statt einen XPath von mit "/cat/noeud/key" Aufbau der XPath aus den generierten Klassen Cat.Noeud.Key

habe ich so etwas für Controller in asp.net Mvc, neugierig, wenn jemand so etwas für XML-Vorlagen verwendet?

[EDIT]

Ich hatte T4-Tag auf meine Frage, aber ich habe nicht ausgearbeitet, der Zweck eine T4.tt haben, die nach jeder Neuübersetzung regeneriert werden, um, wenn wir eine Veränderung haben in die XML-Vorlage wir haben einen Kompilierungsfehler

Antwort

1

Wenn Sie Klassen aus einer XML-Definition generieren möchten, schauen Sie in das Tool namens xsd.exe (link).

Sofern Sie ein XML-Schema (XSD-Datei, link here) definiert haben, das Ihren XML-Code darstellt, kann xsd.exe verwendet werden, um Klassen zu generieren, die mit diesem XML-Schema übereinstimmen.

Eine Instanz einer solchen Klasse wird bei der Serialisierung (als XML) eine XML-Repräsentation dieser Instanz ergeben. (Entspricht dem beim Erstellen der Klassen verwendeten XML-Schema).

0

Wie Geekiod erwähnt, verwende ich XSD. Hier ist mein T4-Setup:

Ich habe MyObject.xml-Datei in meiner T4-Lösung.

Um MyObject.cs von MyObject.xml zu erzeugen (oder zu aktualisieren, wenn ich Änderungen an das MyObject.xml Schema machen) ich diesen Fledermaus-Skript ausführen:

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" 

Das XSD-Programm von der Microsoft SDK läuft in Ihrer XML-Datei. XSD generiert eine XSD-Datei. Sie führen XSD erneut in der neuen XSD-Datei aus und es erstellt Ihre CS-Datei. Alle mit dem gleichen Namen. Das Skript kopiert dann die CS-Datei aus dem SDK-Ordner zurück in mein Projekt.

Jetzt haben Sie Ihre .cs stark typisierte Datei, basierend auf Ihrem XML-Dokument. Sie können nun coole Dinge in Ihren .tt Dateien wie folgen aus:

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

...

Zu meiner T4 Lösung führen Sie den Code aus den .tt-Dateien zu generieren ich die „XMLFileName“ Variable gebunden habe in die TextTemplatingSession-Klasse. Dies ermöglicht dann mir zu zeigen, was auch immer MyObject.xml Datei Ich mag würde (MyOtherObject.xml, Customer.xml, usw.):

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

Das letzte Stück dieser ist, müssen Sie das „Custom Tool“ ändern Option von den Ttt-Dateieigenschaften zu "TextTemplatingFilePreprocessor". Der Standard ist etwas wie "TextTemplatingGenerator", das nicht mit diesem Setup funktioniert.

Hoffe, das hilft!