C# 读入HTML文件并替换为变量

C# 读入HTML文件并替换为变量,c#,string,templates,C#,String,Templates,我有一个HTML文件,它将作为我要发送的电子邮件的模板。html中的字段是可变的。我想知道是否有一种健壮的方法可以用变量替换HTML文件中的占位符。我知道我可以字符串。替换所有的字符串,但这并不理想,因为我有很多变量。下面是html文件的外观 <html> <head> <title></title> </head> <body> <div> Please read the Cruise Control

我有一个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>

但这在我看来有点复杂,因为我在文件中有大约10个变量。有没有什么内置方法可以满足我的要求?任何帮助都将不胜感激,谢谢

这是一个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>

请阅读下面的巡航控制详细信息

发布详情 RFC票证#
您可以使用Apache Velocity引擎到.Net的端口为您做模板


我会考虑使用正则表达式(正则表达式),并给占位符某种特殊的标记(EX:),这样就可以开始对所有的标记进行循环。

然后用一个列表或数据表填充数据,并对整个过程执行一个单循环

查看以下帮助:


(您的确切情况在抓取HTML标记下提到)

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

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

您是否已经考虑将内容序列化为XML,并使用XSLT将其转换为最终的HTML?这将允许在不修改处理代码的情况下进行将来的更改—只在需要时更改xslt。您的发布对象属性名称是否与模板中的名称完全匹配?@AlexK。是的,他们是这样做的,上面的那一行(替换)就是我现在要做的,这是我需要在处理方面做一些特殊的事情,还是它们在运行时被读入?预处理的模板在运行时被处理。只需添加一个构造函数来获取数据,然后将其显示出来。我想知道这与替换有多大不同。在构造函数中,您是否仍然需要循环文件并替换引用?它会留下占位符来执行插入。并提供了更多的功能,然后更换,如果你需要更改模板。复制粘贴作业,以完全符合我的要求。我刚刚替换了解析名。。好东西!!!虽然我认为你可能需要避开“.”字符。现在我想起来了,你可能会得到一些误报。
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();
}