读入HTML文件并替换为变量

时间:2012-02-17 14:57:05

标签: c# string templates

我有一个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>
                &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个左右的变量。是否有任何内置方法可以满足我的要求?任何帮助将不胜感激,谢谢!

4 个答案:

答案 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)

答案 3 :(得分:0)

我会考虑使用REGEX(正则表达式)并为占位符提供某种特殊标记(例如:),以便循环显示所有以#开头的标记。

然后用列表或数据表填充数据,并为整个替换执行1个循环。

检查这些以获取帮助:

http://msdn.microsoft.com/en-us/library/twcw2f1c.aspx

http://www.regular-expressions.info/examples.html(在抓取HTML标签下提到了确切的案例)