我想知道是否已经有东西从XML模板生成一些c#类,以便能够使用xpath使用较少的脆弱代码?从Xml模板生成类来构建XPath
而不必从生成的类Cat.Noeud.Key
我用类似的东西为控制器asp.net的MVC,好奇,如果有人用类似的东西为XML模板的XPATH "/cat/noeud/key"
建设的XPath?
[编辑]
我不得不T4标签我的问题,但我没有详细阐述的,目的是为了有一个T4.tt将每个重新编译后再生,从而如果我们有一个变化xml模板我们将出现编译错误
我想知道是否已经有东西从XML模板生成一些c#类,以便能够使用xpath使用较少的脆弱代码?从Xml模板生成类来构建XPath
而不必从生成的类Cat.Noeud.Key
我用类似的东西为控制器asp.net的MVC,好奇,如果有人用类似的东西为XML模板的XPATH "/cat/noeud/key"
建设的XPath?
[编辑]
我不得不T4标签我的问题,但我没有详细阐述的,目的是为了有一个T4.tt将每个重新编译后再生,从而如果我们有一个变化xml模板我们将出现编译错误
像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”,它不适用于此设置。
希望这会有所帮助!