【问题标题】:Read in HTML file and replace with variables读入 HTML 文件并替换为变量
【发布时间】:2012-02-17 14:57:04
【问题描述】:

我有一个 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。
  • 您的发布对象属性名称是否与模板中的完全匹配?
  • @AlexK。是的,他们这样做了,上面的那一行(替换)就是我现在正在做的事情

标签: c# string templates


【解决方案1】:

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

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

【讨论】:

  • 复制粘贴作业来做我想做的事。我只是替换了解析名称.. 好东西!!!
  • 虽然我认为您可能需要转义“。”特点。考虑到这一点,您可能会得到一些误报。
【解决方案2】:

这是一个为预处理 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>

【讨论】:

  • 在处理方面我需要做一些特别的事情,还是在运行时读取它们?
  • 在运行时处理预处理的模板。只需添加一个构造函数来获取您的数据,然后将其吐出。
  • 我想知道这与替换有多大不同。在构造函数中,您是否仍然需要遍历文件并替换出现的位置?
  • 它留下占位符来进行插入。并提供更多功能,然后在您需要更改模板时替换。
【解决方案3】:

【讨论】:

    【解决方案4】:

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

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

    检查这些以获得帮助:

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

    http://www.regular-expressions.info/examples.html(你的具体情况在抓取 HTML 标签中提到)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 2014-02-16
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 2017-12-03
      • 2018-01-15
      相关资源
      最近更新 更多