最近在做的项目中有一部分需要实现动态生成HTML,下面介绍一下它的解决方案。
1, 需要一个模板,将HTML元素都预先写入模板,动态部分是用变量代替,动态部分比如CSS路径,内容,标题等等。这个变量应该尽量复杂,以免和HTML关键字或则其他元素相同。我们要做的就是在代码中使用内容数组替换那些在模板中的变量。
2,使用StreamReader对象读取模板,读到一个StringBuilder对象中。代码如下:
using (StreamReader sr = new StreamReader(“模板路径”))//注意使用服务器路径
{
String oneline;
// 读取指定的HTML文件模板
while ((oneline = sr.ReadLine()) != null)
{
strhtml.Append(oneline);
}
sr.Close();
}
3,指定要生成的HTML文件,替换标记。代码如下:
string fname = Server.MapPath("webfile") +“文件名”+“随机数”+ ".htm";
for (int i = 0; i < 9; i++)
{
strhtml.Replace("$htmlkey[" + i + "]", newContent[i]);//newContent[]为和标记数相同的数字
}
4,把所有的内容写入文件流中,应该注意的一点是,必须使用相同的编码方式,推荐使用UTF-8,比如说我以前花了1天时间找出的原因竟然是CSS文件的编码方式没有设置成为UTF-8。另外,声称的HTML文件应该删除,要不然在第二次运行预览的时候可能会出现重合的现象。代码如下:
// 创建文件信息对象
FileInfo finfo = new FileInfo(fname);
if (finfo.Exists)
{
finfo.Delete();
}
// 以打开或者写入的形式创建文件流
using (FileStream fs = finfo.OpenWrite())
{
// 根据上面创建的文件流创建写数据流
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
// 把新的内容写到创建的HTML页面中
sw.WriteLine(strhtml);
sw.Flush();
sw.Close();
}
5,打开HTML文件
string strHtmll = "../webfile/epaper/" +iIdx + ".htm";//客户端路径
Response.Write("<script>window.open('" + strHtmll + "')</script>");