1

我有一个使用 xslt 样式的 xml 文件来生成 html 电子邮件模板。我动态地从用户那里获取值,并用接收到的值替换 xml 元素文本。如何获取该 xml 文件并在 c# 中作为 html 电子邮件正文发送?

我的 Xml 看起来像这样

  <?xml version="1.0" encoding="utf-8" ?>
  <?xml-stylesheet type="text/xsl" href="EmailTemplateStyleForHTML.xslt"?>
 <EmailTemplate>
   <subject>Information from xyz</subject>
   <displayName>abcd</displayName>
   <Message1>
    Thanks you for registering to xyz.
  </Message1>
  <Copyright>Copyright xyz</Copyright>
 </EmailTemplate>

我正在使用 LINQ 将值设置为 xml。注意:我知道如何从 xml 获取和设置值,但我想要将整个 xml 文件抓取到电子邮件正文中。

如果您认为对此有更好的方法,我很乐意听到。我将衷心感谢您的帮助。

回复后编辑:xsl转换部分:

            TextReader tr1 = new StringReader(@"EMailTemplateHtml.xml");
            var tr11 = new XmlTextReader(tr1);
            var xPathDocument = new XPathDocument(tr11);

            //read XSLT

            TextReader tr2 = new StringReader(@"EmailTemplateStyleForHTML.xslt");
            var tr22 = new XmlTextReader(tr2);
            var xslt = new XslTransform();
            xslt.Load(tr22);


            var sb = new StringBuilder();
            TextWriter tw = new StringWriter(sb);

            xslt.Transform(xPathDocument, null, tw);

            emailBody = sb.ToString();

我正在按照您所说的进行转换(@Roy Ashbrook)我在这里遗漏了什么吗?

4

1 回答 1

0

我相信您需要在内存中实际执行 XSL 转换,而不是在 XML 本身中引用它。您可以将 XSL 存储在远程位置并以这种方式引用它,但我不会

所以:

  1. 将您的值注入您的 xml 字符串
  2. 使用您的 xsl 转换您的 xml
  3. 使您的 html 消息正文

这是一些代码。主要借鉴/启发: 如何使用 .NET 中的文件将 XML 转换为不带文件的字符串?使用 C# 发送电子邮件

void Main()
{
    SendHtmlBody(GetHtmlBody());
}
void SendHtmlBody(string HtmlBody){
    using(SmtpClient c = new SmtpClient())
    {
        //set smtp options here
        using(MailMessage msg = new MailMessage("from@replace.me","to@replace.me"))
        {
            msg.Subject = "Testing Bulk mail application";
            msg.Body = HtmlBody;
            msg.IsBodyHtml = true;
            //c.Send(msg);
        }
    }
}
string GetHtmlBody(){
    string xmlInput = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
    <EmailTemplate>
    <subject>Information from xyz</subject>
    <displayName>abcd</displayName>
    <Message1>
        Thanks you for registering to xyz.
    </Message1>
    <Copyright>Copyright xyz</Copyright>
    </EmailTemplate>";

        string xslInput = @"<?xml version=""1.0"" encoding=""ISO-8859-1""?>
    <xsl:stylesheet version=""1.0""
    xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
    <xsl:template match=""/"">
    <html>
    <body>
        <h5><xsl:value-of select=""EmailTemplate/subject""/></h5>
        <h5><xsl:value-of select=""EmailTemplate/displayName""/></h5>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>";

    using (StringReader srt = new StringReader(xslInput)) // xslInput is a string that contains xsl
    using (StringReader sri = new StringReader(xmlInput)) // xmlInput is a string that contains xml
    {
        using (XmlReader xrt = XmlReader.Create(srt))
        using (XmlReader xri = XmlReader.Create(sri))
        {
            XslCompiledTransform xslt = new XslCompiledTransform();
            xslt.Load(xrt);
            using (StringWriter sw = new StringWriter())
            using (XmlWriter xwo = XmlWriter.Create(sw, xslt.OutputSettings)) // use OutputSettings of xsl, so it can be output as HTML
            {
                xslt.Transform(xri, xwo);
                return sw.ToString();
            }
        }
    }
}
于 2013-03-23T03:42:47.150 回答