我有一个HTML文件,可以作为我要发送的电子邮件的模板。 html中的字段是可变的。我想知道是否有一种强大的方法用变量替换HTML文件中的占位符。我知道我可以使用string.Replace所有这些,但这并不理想,因为我有很多变量。这是html文件的样子
<html>
<head>
<title></title>
</head>
<body>
<div>
Please read the Cruise Control Details Below<br>
<br>
<table width='100%'>
<tr>
<td width='100%' colspan='5'>
<font size='4'><b>Release Details</b></font>
</td>
</tr>
<tr>
<td width='20%'>
<b>RFC Ticket #</b>
</td>
<td>
%release.RFCTicket%
</td>
<td>
</td>
<td>
</td>
<td width='10%'>
</td>
<td width='20%'>
<b>Project / Release Name</b>
</td>
<td width='20%'>
%release.ReleaseName%
</td>
</tr>
<tr>
<td width='20%'>
<b>Release Date</b>
</td>
<td width='20%'>
%release.ReleaseDateString%
</td>
<td>
</td>
<td>
</td>
<td width='10%'>
</td>
<td width='20%'>
<b>Release Time</b>
</td>
<td width='20%'>
%release.ReleaseTimeString%
</td>
</tr>
<tr>
<td width='20%'>
<b>CAB Approval Status</b>
</td>
<td width='20%'>
%release.CABApproval%
</td>
</tr>
<tr>
<td width='100%' colspan='5'>
</td>
</tr>
<tr>
<td width='100%' colspan='5'>
<font size='4'><b>Contact Information:</b></font>
</td>
</tr>
<tr>
<td width='20%'>
<b>Project / Team Lead</b>
</td>
<td width='20%'>
%release.TeamLead%
</td>
<td width='10%'>
</td>
<td width='20%'>
<b>On Call DSE</b>
</td>
<td width='20%'>
%release.OnCallDSE%
</td>
</tr>
<tr>
<td width='20%'>
<b>Phone</b>
</td>
<td width='20%'>
%release.ContactInfo%
</td>
<td>
</td>
<td>
</td>
<td>
</td>
<td width='10%'>
</td>
<td width='20%'>
<b>Phone</b>
</td>
<td width='20%'>
%release.OnCallDSEContact%
</td>
</tr>
<tr>
<td>
</td>
</tr>
<tr>
<td width='100%' colspan='5'>
<font size='4'><b>Migration Details:</b></font>
</td>
</tr>
<tr>
<td width='20%'>
<b>Deploy Dashboard</b>
</td>
<td width='20%'>
</td>
<td width='10%'>
</td>
<td width='20%'>
<td>
</td>
<td>
</td>
<b>Deploy Task</b>
</td>
<td width='20%'>
</td>
</tr>
%createTaskTable(ParseSpecialInstuctions().Split('|'))%</table>
</div>
我想将“%%”之间的值替换为代表它们的代码中的变量。我很容易
string.Replace("%release.RFCTicket%",release.RFCTicket);
但是我认为这有点令人费解,因为我在文件中有10个左右的变量。是否有任何内置方法可以满足我的要求?任何帮助将不胜感激,谢谢!
答案 0 :(得分:4)
使用正则表达式查找匹配项。我认为适当的正则表达式将是:
%release.\S+%
从那里,您可以检查每个匹配,并从匹配中解析成员名称。从那里你可以通过反射从你的实例(在这种情况下发布)中获取成员的值,并进行字符串替换。
像这样的东西。它可以使用一些重构来消除多余的调用,我不知道它是否完全有效,但你明白了......
var regex = new Regex("%release.\S+%");
var match = r.Match(htmlText);
while (match.Success)
{
var value = match.Value;
var memberName = ParseMemberName(value); //Some code you write to parse out the member name from the match value
var propertyInfo = release.GetType().GetProperty(memberName);
var memberValue = propertyInfo.GetValue(release, null);
htmlText = htmlText.Replace(value, memberValue != null ? memberValue.ToString() : string.Empty);
match = match.NextMatch();
}
答案 1 :(得分:0)
对于预处理的t4模板
,这是一个很好的Probel您可以在模板中预先格式化帮助,并允许模板引擎进行替换。下面是一个小例子。
<div>
Please read the Cruise Control Details Below<br>
<br>
<table width='100%'>
<tr>
<td width='100%' colspan='5'>
<font size='4'><b>Release Details</b></font>
</td>
</tr>
<tr>
<td width='20%'>
<b>RFC Ticket #</b>
</td>
<td>
<#= RCFTicketVariable #>
</td>
答案 2 :(得分:0)
您可以使用Apache Velocity Engine端口为.Net为您进行模板化
http://velocity.apache.org/engine/
答案 3 :(得分:0)
我会考虑使用REGEX(正则表达式)并为占位符提供某种特殊标记(例如:),以便循环显示所有以#开头的标记。
然后用列表或数据表填充数据,并为整个替换执行1个循环。
检查这些以获取帮助:
http://msdn.microsoft.com/en-us/library/twcw2f1c.aspx
http://www.regular-expressions.info/examples.html(在抓取HTML标签下提到了确切的案例)