您的位置:首页 > 其它

使用T4模板读取XML文件

2010-06-02 16:34 399 查看
有的时候,我们需要定义一些Enum类型,一种比较灵活的做法是用T4模板去读取指定的XML,然后根据NODE生成我们想到的Enum类型。首先看,我们有这样一个XML文件:

<?xmlversion="1.0"encoding="utf-8"?>
<Root>
<ElementName="Red"/>
<ElementName="Blue"/>
</Root>

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

然后我们编写扩展名为TT的模板文件在VisualStudio中:

<#@templatelanguage="C#"hostspecific="True"#>
<#@assemblyname="System.Core"#>
<#@assemblyname="System.Xml"#>
<#@importnamespace="System.Xml"#>
<#@importnamespace="System.Collections.Generic"#>
<#@importnamespace="System.IO"#>
usingSystem;
namespaceExamples
{
publicclassExampleClass
{
#regionEnums
publicenumMyExampleEnum
{
<#
foreach(stringnameinthis.GetNames())
{
#>
<#=name#>,
<#
}
#>
}
#endregion
}
}
<#+
publicList<string>GetNames()
{
List<string>result=newList<string>();
XmlDocumentdoc=newXmlDocument();
stringabsolutePath=Host.ResolvePath("MyEnum.xml");
doc.Load(absolutePath);
foreach(XmlNodenodeindoc.SelectNodes("/Root/Element"))
{
result.Add(node.Attributes["Name"].InnerText);
}
returnresult;
}
#>

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

最后执行这个模板文件,将会在当前目录下,生成如下的CODE文件:

usingSystem;
namespaceExamples
{
publicclassExampleClass
{
#regionEnums
publicenumMyExampleEnum
{
Red,
Blue,
}
#endregion
}
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

是不是很简单,当然你可以编写更加复杂的模板文件,生成你想到CODE。

如果你不了解T4模板,你可以参考MSDN,如你已经了解,那么你有可能对以下文章感兴趣:

T4(TextTemplateTransformationToolkit)实现简单实体代码生成

LinqtoEntity的T4模板生成代码

作者:PetterLiu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-PetterLiuBlog。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: