我有一个带XML标签的字符串
<?XML version="1.0" encoding="UTF-8"?>
<s-d-structure>
<heading>This is title</heading>
<main>
<cad>
<bad>this is formatted html</bad>
<name>some text </name>
<title>show</title>
</cad>
</main>
</s-d-structure>
我想获取所有标签之间的内容以及没有开放标签和结束标签的标签。
输出应为
错:这是格式化的html
名称:一些文字
标题:显示
如何在我的力度模板文件中执行此操作
答案 0 :(得分:3)
Velocity是一种模板语言,编程能力极低。它通常用于生成XML,而不是处理它们。 VTL本身不能用于此,但鉴于您可以在上下文中放置任何Java对象,您可以使用知道如何将XML字符串解析为DOM的工具,您可以进一步处理该工具。 Velocity Tools已经有XmlTool,您可以启用并使用它。
如果您无法在项目中配置工具,那么您可以尝试简单的字符串处理,尽管这非常脆弱。不要忘记Velocity中的变量是真正的Java对象,可以调用任何公共方法:
#set ($xml = '<?xml version="1.0" encoding="UTF-8"?>
<s-d-structure> <heading>This is title</heading>
<main> <cad>
<bad>this is formatted html</bad>
<name>some text </name>
<title>show</title>
</cad> </main>
</s-d-structure>')
## Extract only the main content
#set ($xml = $xml.replaceFirst('(?s).*<cad>(.*)</cad>.*', '$1'))
## There's no #while in Velocity, so we just loop long enough
#foreach ($i in [0..10000])
## Extract the first tag
$xml.replaceFirst('(?s)\s*+<([^>]++)>([^<]*+)</.*+', '$1: $2')
#set ($xml = $xml.replaceFirst('(?s)\s*+<[^>]++>[^<]*+</[^>]++>(.*+)', '$1'))
#if ($xml.trim() == '')
## Stop the foreach once the string is empty
#break($foreach)
#end
#end