2016-09-16 27 views
3

我有一個velocity模板,它代表一個XML文件。我使用傳遞給VelocityContext對象的數據填充標籤之間的文本。然後在模板內部訪問它。速度模板從Velocity上下文中轉義XML

這裏有一個例子可以稱之爲myTemplate.vm:

<text>$myDocument.text</text> 

,這是怎麼了傳遞數據的速度文件,並將其建設輸出作爲一個字符串:

private String buildXml(Document pIncomingXml) 
    { 
    // setup environment 
    Properties lProperties = new Properties(); 
    lProperties.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); 

    VelocityContext lVelocityContext = new VelocityContext(); 
    lVelocityContext.put("myDocument" , pIncomingXml.getRootElement()); 

    StringWriter lOutput = new StringWriter(); 

    try 
    { 
     Velocity.init(lProperties); 
     Velocity.mergeTemplate("myTemplate.vm", "ISO-8859-1", lVelocityContext, lOutput); 
    } 
    catch (Exception lEx) 
    { 
     throw new RuntimeException("Problems running velocity template, underlying error is " + lEx.getMessage(), lEx); 
    } 
    return lOutput.toString(); 
} 

問題是,當我訪問模板文件中的myDocument.text時,它將輸出不會轉義爲XML的文本。

我發現了一個解決有關此也通過添加一個VelocityContext的逃生工具,像這樣的:使用它

lVelocityContext.put("esc", new EscapeTool()); 

然後包裹我的模板標籤:

<text>$esc.xml($myDocument.text)</text> 

現實情況是我有一個非常大的模板,並且對於我來說,手動包裝每個元素在$ esc.xml上下文中將非常耗時。有沒有一種方法,我可以告訴速度逃避XML訪問myDocument,而根本不編輯模板文件?

+0

顯然,你問兩個獨立的問題(也可能混淆需要對他們)。第一個問題是「在沒有編輯模板文件的情況下,是否可以通過訪問myDocument來告訴速度逃離XML?」。第二個問題不是直接問,而是你在這裏感到麻煩。這是「EscapeTool.xml()對我來說太慢了,如何提高xml轉義速度?」。關於第一個問題,我的猜測是「不」。你可以嘗試使用smthng:https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html#escapeXml(java.lang.String) ? – rsutormin

+0

嗯,它看起來像這個StringEscapeUtils正是在EscapeTool.xml()中使用的:http://grepcode.com/file/repository.springsource.com/org.apache.velocity/com.springsource.org.apache。 velocity.tools.view/2.0.0/org/apache/velocity/tools/generic/EscapeTool.java#347。然後,您可以改進的唯一方法是檢查傳入Document的toString()方法中發生了什麼。你能測量'pIncomingXml.toString()'的時間嗎? – rsutormin

+0

速度不是問題。它只是一個接一個地逃避每個元素的手動操作,並且可能會出錯。 – Suipaste

回答

4

是的,這是可能的。

你需要做的是使用EscapeXMLReference,它實現了reference insertion handler接口:

lProperties.put("eventhandler.referenceinsertion.class", 
       "org.apache.velocity.app.event.implement.EscapeXmlReference"); 
+0

奇妙的外觀正好逃脫了我所需要的,而不必觸摸模板文件。 – Suipaste