我正在寻找一个独立的,易于使用的C#代码,模板引擎。 我想创建一个带有数据占位符的HTML和XML文件, 并用我的代码中的数据填充它们。
引擎需要支持循环(复制模板的部分形成多于一个对象)和条件(仅当某些条件为真时才将模板的一部分添加到最终的HTML / XML中)。 有人可以为我推荐一个好的选项,并添加一个或多或少这样的代码示例的链接,以及一些关于如何使用推荐的组件满足我的需求的文档吗?
我还需要使用循环来复制表行,甚至整个表(在HTML版本中)和复杂元素(在XML版本中)。
答案 0 :(得分:22)
我使用StringTemplate效果很好。一些资源:
答案 1 :(得分:16)
T4,Text Template Transformation Toolkit怎么样?它应该符合您的要求,并且内置在Visual Studio中。
伟大的T4资源:
答案 2 :(得分:16)
有一篇很好的文章如何使用RazorView引擎: How to create a localizable text template engine using RazorEngine
答案 3 :(得分:10)
SmartFormat是一个非常简单的库,可以满足您的所有要求。它专注于撰写“自然语言”文本,非常适合从列表生成数据或应用条件逻辑。
语法与String.Format
极为相似,非常简单易学易用。以下是文档中语法的示例:
Smart.Format("{Name}'s friends: {Friends:{Name}|, |, and}", user)
// Result: "Scott's friends: Michael, Jim, Pam, and Dwight"
该库是开源的,易于扩展,因此您还可以使用其他功能对其进行增强。
答案 4 :(得分:6)
你看过XSLT了吗?您必须从XML开始使用源数据格式,可能是通过xmlserializing您的数据对象。您可以轻松完成loops和if statements!
Kathleen Dollard有a book on generating code via XSLT。
就个人而言,我是T4的忠实粉丝(特别是在生成C#时),但您可能会发现,因为XML和HTML是您的输出类型,所以XSLT已经涵盖了您。而且它非常跨平台。
答案 5 :(得分:2)
我的类库中内置了一个模板引擎,其外观和工作方式类似于旧式ASP或T4。
您基本上在< %%>中编写C#代码块,因此可以完成C#可以做的大部分工作,但是整个模板文件被编译为单个方法的限制。换句话说,你不能在模板中定义辅助类等,但对于辅助方法,你可以使用匿名方法。
示例:
<%
var firstname = "Bob";
var count = 10;
for (Int32 index = 0; index < count; index++)
{
%>
<%= firstname %> x <%= index+1 %>/<%= count %>
<%
}
%>
然后将其编译到另一个appdomain中的C#类,并且可以执行它以返回包含生成文本的字符串。
您还可以将参数传递给模板,还可以引用类库,这意味着您可以传递自定义数据结构,或从模板访问数据访问层或业务逻辑代码。
如果您想查看它,我的类库中的代码可以从我的Subversion存储库或网页中获得:
对于subversion存储库,您需要一个用户名和密码,两者都是“guest”,没有引号。
代码位于LVK.Text.Templating项目/程序集中。
另外,请告诉我(请参阅个人资料页面上的电子邮件,或发表评论),我将为您提供更多示例。
答案 6 :(得分:1)
您可能需要.NET Template Engine。
模板代码:
$Book.StaticId$
ID: $bk.BookId$ - Author: $bk.Author.Name$
Length of the author's Name: $bk.Author.Name.Length$
C#代码:
class Author
{
public string Name
{
get
{
return "John Borders";
}
}
}
class Book
{
public static string StaticId
{
get
{
return "AABB";
}
}
public int BookId
{
get
{
return 100;
}
}
public Author Author
{
get
{
return new Author();
}
}
}
public class PropertySample1
{
[STAThread]
static void Main()
{
TemplateEngine dt = new TemplateEngine();
dt.LoadFromFile("Template.tpl");
Book book = new Book();
dt.SetValue("bk", book);
dt.UsingNamespace("CSharp,Demo");
string output = dt.Run();
Console.WriteLine(output);
}
}
输出是:
AABB
ID: 100 - Author: John Borders
12