Java Mail XML - 将变量插入xml返回的数据中

时间:2013-11-01 12:13:43

标签: java xml email

所以我试图在标题中尽可能清楚地写出我的问题,但我会详细说明情况。目前在java中,我试图从我创建的电子邮件模板中获取信息。

获得电子邮件数据后,我需要将变量注入电子邮件内容的不同部分。

因此,例如,我有3个不同的电子邮件模板,用xml文件编写。 etemplate1.xml,etemplate2,etemplate3。

到目前为止,我使用以下代码获取信息。

    String fm_subject = "";  // Formatted string of email subject
    String fm_bodytext = ""; // Formatted string of email body text
    String fm_bodytables = ""; // Formatted string of email body tables

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    org.w3c.dom.Document doc = dBuilder.parse(getServletContext().getResourceAsStream("/"+requestType+".xml"));
    doc.getDocumentElement().normalize();

    NodeList nList = doc.getElementsByTagName("emailtemplate");

        Node nNode = nList.item(0);

        if (nNode.getNodeType() == Node.ELEMENT_NODE) {

            Element eElement = (Element) nNode;

            fm_subject = eElement.getElementsByTagName("subject").item(0).getTextContent();
            fm_bodytext = eElement.getElementsByTagName("bodytext").item(0).getTextContent();
            fm_bodytables = eElement.getElementsByTagName("bodytable").item(0).getTextContent();

注意:requestType =将使用的模板

XML电子邮件模板示例:

  <?xml version="1.0"?>
<emailtemplates>
    <emailtemplate>
        <subject>
        subject information


        </subject>
        <bodytext>

        This is the  Body Text


        </bodytext>
        <bodytable>

        This Body Tables



        </bodytable>
    </emailtemplate>
</emailtemplates>

我需要做的是使用变量格式化我从xml文件中获取的数据。问题是,我不能只将一个变量添加到返回数据的末尾。

示例代码:

user_id //示例变量

user_code //示例变量

fm_bodytext = eElement.getElementsByTagName("bodytext").item(0).getTextContent() + user_id + user_code;

这会将变量始终附加到正文信息的末尾。我需要在xml元素bodytext之间添加变量。

这是一个明确的例子,用纯文字说明我是怎么想的。

            <bodytext>

        This is the  Body Text

             hi user_id,  your code is user_code



        </bodytext>

希望我已经很好地解释了我的问题。如果没有,请告诉我,我会尽力解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:1)

您是否考虑过使用XSLT从模板中呈现新的XML?见http://www.w3schools.com/xsl/

示例类:

import java.io.ByteArrayInputStream;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.junit.Test;

public class XMLOutTest{

@Test
public void textXML() {
    String input = "<?xml version=\"1.0\"?>" + "<root><subject>my subject</subject><bodytext>my body text</bodytext>my body table<bodytable></bodytable></root>";
    try {
        StreamSource src = new StreamSource(new ByteArrayInputStream(input.getBytes()));
        StreamSource xslSrc = new StreamSource(this.getClass().getResourceAsStream("/xmltransform.xsl"));
        StreamResult result = new StreamResult(System.out);

        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer t = factory.newTransformer(xslSrc);
        t.transform(src, result);

    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerException e) {
        e.printStackTrace();
    }
}
}

你的xsl-template:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"></xsl:output>
    <xsl:template match="root">
        <emailtemplates>
            <emailtemplate>
                <subject>
                    <xsl:text>subject information</xsl:text>
                    <xsl:value-of select="./subject"></xsl:value-of>
            </subject>
            <bodytext>
                <xsl:text>This is the Body Text</xsl:text>
                <xsl:value-of select="./bodytext"></xsl:value-of>
            </bodytext>
            <bodytable>
                <xsl:text>This Body Tables</xsl:text>
                <xsl:value-of select="./bodytable"></xsl:value-of>
            </bodytable>
        </emailtemplate>
    </emailtemplates>
</xsl:template>