我有一個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,而根本不編輯模板文件?
顯然,你問兩個獨立的問題(也可能混淆需要對他們)。第一個問題是「在沒有編輯模板文件的情況下,是否可以通過訪問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
嗯,它看起來像這個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
速度不是問題。它只是一個接一個地逃避每個元素的手動操作,並且可能會出錯。 – Suipaste