2012-02-17 45 views
3

我有一个HTML文件,它将充当我要发送的电子邮件的模板。有html中的字段是可变的。我想知道是否有一个强大的方法来替换HTML文件中的占位符与变量。我知道我可以串起来,替换掉所有这些,但是这并不理想,因为我有很多变数。下面是HTML文件看起来像什么阅读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> 
       &nbsp; 
      </td> 
      <td> 
       &nbsp; 
      </td> 
      <td width='10%'> 
       &nbsp; 
      </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> 
       &nbsp; 
      </td> 
      <td> 
       &nbsp; 
      </td> 
      <td width='10%'> 
       &nbsp; 
      </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'> 
       &nbsp; 
      </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%'> 
       &nbsp; 
      </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> 
       &nbsp; 
      </td> 
      <td> 
       &nbsp; 
      </td> 
      <td> 
       &nbsp; 
      </td> 
      <td width='10%'> 
       &nbsp; 
      </td> 
      <td width='20%'> 
       <b>Phone</b> 
      </td> 
      <td width='20%'> 
       %release.OnCallDSEContact% 
      </td> 
     </tr> 
     <tr> 
      <td> 
       &nbsp; 
      </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%'> 
       &nbsp; 
      </td> 
      <td width='10%'> 
       &nbsp; 
      </td> 
      <td width='20%'> 
       <td> 
        &nbsp; 
       </td> 
       <td> 
        &nbsp; 
       </td> 
       <b>Deploy Task</b> 
      </td> 
      <td width='20%'> 
       &nbsp; 
      </td> 
     </tr> 
     %createTaskTable(ParseSpecialInstuctions().Split('|'))%</table> 
</div> 

我想在“%%”用代码表示他们之间的变量替换值。我可以很容易地

string.Replace("%release.RFCTicket%",release.RFCTicket); 

但是这在我看来有点令人费解,因为我有10个左右的文件变量。有什么内置的方法可以满足我的要求吗?任何帮助将不胜感激,谢谢!

+0

您是否已经考虑到您的内容序列化到XML和转换到最后html使用xslt?这将允许在未对处理代码进行任何修改的情况下进行未来更改 - 只需在需要时更改xslt即可。 – Filburt 2012-02-17 15:01:10

+1

您的发布对象属性名称是否与模板中的属性名称完全匹配? – 2012-02-17 15:02:56

+0

@AlexK。是的,他们这样做,上面的行(替换)是我现在要做的 – 2012-02-17 15:14:33

回答

3

使用正则表达式来找到你的比赛。我认为适当的正则表达式是沿着线:

%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(); 
} 
+0

复制粘贴作业以完成我想要的任务。我刚刚取代了解析名称..伟大的东西! – 2012-02-17 17:26:16

+0

虽然我认为你可能需要逃避“。”字符。现在我想到了,你可能会得到一些误报。 – 2012-02-17 19:40:55

0

这是一个预处理t4模板

你可以有你的帮助模板preformated并允许模板引擎做更换发Probel一个talor。下面是一个小例子。

<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> 
+0

有什么特别的我需要做的处理方面,或者他们在运行时读入? – 2012-02-17 15:19:32

+0

预处理的模板在运行时得到处理。只需添加一个构造函数,然后将其抽出即可。 – rerun 2012-02-17 15:21:26

+0

我想知道比替换多少不同。在构造函数中,你是否仍然需要遍历该文件并替换事件? – 2012-02-17 15:27:24