Groovy SimpleTemplateEngine和XML数组变量

时间:2016-06-24 14:31:28

标签: xml templates groovy

我们有一个使用Groovy SimpleTemplateEngine生成文本文档的应用程序。输入是解析的XML文档,我们通常可以从模板中的表达式引用任何这些字段:

def xml = new XmlParser().parseText(xmldocument)
def engine = new SimpleTemplateEngine()
def script = new File(template_file).text
def vars = [xml: xml, ... ]
output = engine.createTemplate(script).make(vars).toString()

在模板脚本中,我们使用Groovy表达式语法引用XML文档中的元素:Hello ${xml.FirstName}(假设" FirstName"是上面解析的XML的一部分)。

我们遇到的问题是理解在引用XML数组中的项时使用的语法。例如,我们有这样的XML:

<Contact>
  <Name>111</Name>
  <Phone>111</Phone>
</Contact>
<Contact>
  <Name>222</Name>
  <Phone>222</Phone>
</Contact>

模板文件中表达式的语法是什么,让我们引用(比如说)第二个联系人的姓名和电话?我们尝试了${xml.Contact[1].Name}的变体,但这似乎无法奏效。

1 个答案:

答案 0 :(得分:1)

给定xml(已更正为</Phone>关闭标记:

def xmldocument = '''<Contacts>
                    |    <Contact>
                    |        <Name>111</Name>
                    |        <Phone>111</Phone>
                    |    </Contact>
                    |    <Contact>
                    |        <Name>222</Name>
                    |        <Phone>222</Phone>
                    |    </Contact>
                    |</Contacts>'''.stripMargin()    

def xml = new XmlParser().parseText(xmldocument)

模板:

def script = 'Hello ${xml.Contact[1].Name.text()}'

然后你可以这样做:

import groovy.text.*

def engine = new SimpleTemplateEngine()
def vars = [xml: xml]
output = engine.createTemplate(script).make(vars).toString()

assert output == 'Hello 222'

将通过