速度中的xml字符串操作

时间:2013-08-08 06:34:42

标签: javascript velocity

我有一个带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

名称:一些文字

标题:显示

如何在我的力度模板文件中执行此操作

1 个答案:

答案 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