在 HTML 文件中读取并替换变量

4

我有一个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个变量。是否有任何内置方法可以实现我所要求的功能?感谢您的帮助!


你考虑过将内容序列化为 XML 并使用 XSLT 转换为最终的 HTML 吗?这样可以在不修改处理代码的情况下进行未来更改 - 只需在需要时更改 XSLT 即可。 - Filburt
1
你的释放对象属性名称与模板完全匹配吗? - Alex K.
@AlexK,是的,他们确实会。上面那行代码(replace)就是我现在正在使用的来完成这个任务的方法。 - Isaac Levin
4个回答

4

使用正则表达式来查找匹配项。我认为适当的正则表达式应该是:

%release.\S+%

从那里,您可以检查每个匹配项,并从匹配项中解析成员名称。然后,通过反射,您可以从实例(在此示例中为“release”)获取成员的值,并进行字符串替换。

类似于这样。它可能需要一些重构来消除冗余调用,我不知道它是否完全有效,但您已经有了想法...

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

复制粘贴工作完全符合我的要求。我只是替换了解析名称..太棒了!!! - Isaac Levin
虽然我认为你可能需要转义“.”字符。现在我想起来,你可能会得到一些误报。 - Sean H

0

这是一个为预处理t4模板量身定制的问题。

您可以在模板中预先格式化您的帮助,并允许模板引擎进行替换。以下是一个小例子。

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

在处理方面,我需要做一些特殊的事情吗?还是它们会在运行时被读取? - Isaac Levin
一个预处理的模板在运行时被处理。只需添加一个构造函数,将您的数据传递进去,然后展开它。 - rerun
我在想这与替换相比有多大的不同。在构造函数中,您仍然需要循环遍历文件并替换出现的内容吗? - Isaac Levin
它留下占位符以进行插入,并且如果您需要更改模板,则提供比替换更多的功能。 - rerun


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接