2013-11-01 58 views
0

所以我試圖寫我的問題儘可能清晰的標題,但我會詳細說明情況。目前在Java中,我試圖從我創建的電子郵件模板中獲取信息。Java郵件XML - 插入變量到XML返回的數據

一旦我收到了電子郵件數據,我需要將變量注入電子郵件內容的不同部分。

因此,例如,我有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(); 

注:請求類型=將要使用的模板

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> 

希望我已經很好地解釋了我的問題。如果沒有,請讓我知道,我會盡力澄清這個問題。

謝謝!

+0

您可以從該節點的文本內容,使用'與string.replace()',然後從XML中刪除文本節點並在其位置添加替換的字符串。不幸的是,W3C的DOM是愚蠢的,這可能有點煩人。我會考慮使用JDOM,你可以使用['Element.getText()'](http://www.jdom.org/docs/apidocs/org/jdom2/Element.html#getText()),[' Element.removeChildren()'](http://www.jdom.org/docs/apidocs/org/jdom2/Element.html#removeContent())和['Element.addContent(String)'](http:// www.jdom.org/docs/apidocs/)進行這些步驟。 – millimoose

+0

謝謝你的洞察millimoose。我將考慮您的JDOM替代品,我會試一試。我完全忘記了字符串。取代,這是完美的,我需要什麼。 –

回答

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模板:

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

+0

謝謝你的建議!我相信這種方法也可以。我已經設法解決我的問題,使用millimoose的建議。這是很好的信息,雖然如果人們需要從我正在使用的另一種方法。我建議這兩個問題都是可行的答案。 –