基于NVelocity的几种内容生成方式汇总

2019-05-22 10:10:56王振洲

在生成内容之前,需要把相关的对象属性绑定到模板引擎的上下文对象里面。

/// <summary>
/// 初始化上下文的内容
/// </summary>
private void InitContext()
{
context = new VelocityContext();
foreach (string key in KeyObjDict.Keys)
{
context.Put(key, KeyObjDict[key]);
}
}

1)根据模板文件构造对应的文件内容

/// <summary>
///根据模板创建输出的文件,并返回生成的文件路径
/// </summary>
public virtual string ExecuteFile()
{
string fileName = "";
if (template != null)
{
string filePath = CheckEndBySlash(directoryOfOutput);
fileName = filePath + fileNameOfOutput + fileExtension;
if (!string.IsNullOrEmpty(filePath) && !Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
//LogTextHelper.Debug(string.Format("Class file output path:{0}", fileName));
InitContext();
using (StreamWriter writer = new StreamWriter(fileName, false))
{
template.Merge(context, writer);
}
}
return fileName;
}

2)根据模板文件构造字符串内容

/// <summary>
/// 根据模板输出字符串内容
/// </summary>
/// <param name="templateFile"></param>
/// <returns></returns>
public string ExecuteString()
{
InitContext(); 
System.IO.StringWriter writer = new System.IO.StringWriter();
template.Merge(context, writer);
return writer.GetStringBuilder().ToString();
}

3)根据字符串内容构造字符串输出

/// <summary>
/// 合并字符串的内容
/// </summary>
/// <returns></returns>
public string ExecuteMergeString(string inputString)
{
VelocityEngine templateEngine = new VelocityEngine();
templateEngine.Init();
InitContext();
System.IO.StringWriter writer = new System.IO.StringWriter();
templateEngine.Evaluate(context, writer, "mystring", inputString);
return writer.GetStringBuilder().ToString();
}

上面几种操作模板输出的方式,其调用代码如下所示。

private void btnGenerateFile_Click(object sender, EventArgs e)
{
string tempalte = "Template/template.htm";//相对目录
TestInfo info = new TestInfo();
info.Title = "测试标题";
info.Content = "测试内容,这是测试内容";
info.Datetime = DateTime.Now;
NVelocityHelper adapter = new NVelocityHelper(tempalte);
adapter.AddKeyValue("title", "This is a title")
.AddKeyValue("content", "This is a Content")
.AddKeyValue("datetime", System.DateTime.Now)
.AddKeyValue("TestInfo", info);
adapter.FileNameOfOutput = "testTemplate";
string filePath = adapter.ExecuteFile();
if (!string.IsNullOrEmpty(filePath))
{
Process.Start(filePath);
}
} 
private void btnGenerate_Click(object sender, EventArgs e)
{
string tempalte = "Template/template.htm";//相对目录
TestInfo info = new TestInfo();
info.Title = "测试标题";
info.Content = "测试内容,这是测试内容";
info.Datetime = DateTime.Now;
NVelocityHelper adapter = new NVelocityHelper(tempalte);
adapter.AddKeyValue("title", "This is a title")
.AddKeyValue("content", "This is a Content")
.AddKeyValue("datetime", System.DateTime.Now)
.AddKeyValue("TestInfo", info);
this.txtCode.Text = adapter.ExecuteString();
} 
private void btnMergeString_Click(object sender, EventArgs e)
{
System.Text.StringBuilder builder = new System.Text.StringBuilder();
builder.Append(
"${Title}rn" +
"$Contentrn" +
"$Digestrn" +
"$Authorrn" +
"$Keywordrn" +
"$DateTimern");
NVelocityHelper adapter = new NVelocityHelper();
adapter.AddKeyValue("Title", "标题").
AddKeyValue("Content", "内容").
AddKeyValue("Digest", "摘要").
AddKeyValue("Author", "作者").
AddKeyValue("Keyword", "关键词").
AddKeyValue("DateTime", DateTime.Now);
this.txtCode.Text = adapter.ExecuteMergeString(builder.ToString());
}