gpt4 book ai didi

java - Velocity 模板从 Velocity Context 中转义 XML

转载 作者:数据小太阳 更新时间:2023-10-29 02:04:40 31 4
gpt4 key购买 nike

我有一个速度模板,它代表一个 XML 文件。我使用传递给 VelocityContext 对象的数据填充标签之间的文本。然后在模板中访问它。

这是一个例子,我们称之为 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 上下文中将非常耗时。有没有一种方法可以告诉 velocity 在访问 myDocument 时对 XML 进行转义,而根本无需编辑模板文件?

最佳答案

是的,这是可能的。

您需要做的是使用 EscapeXMLReference , 它实现了 reference insertion handler界面:

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

关于java - Velocity 模板从 Velocity Context 中转义 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39535719/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com