Groovy NodeBuilder:如何传递闭包

时间:2014-01-09 22:19:09

标签: xml groovy

我提前为新手问题道歉,但现在是。假设我正在尝试使用Groovy的NodeBuilder生成标记。我想写下面的内容:

nodes = { 
  'element'(key:'value')
  'element'(blah:'123') 
}
def createMarkup(additionalElements) {    
  def result = new groovy.xml.MarkupBuilder().root{
    someElement(){
      element(y: 'uh oh')  
      additionalElements() // does not work this way!
      element(z: 'yeah')
    }
  }
}

createMarkup(nodes)

导致:

<root>
  <someElement>
    <element y='uh oh' />
    <element z='yeah' />
  </someElement>
</root>

简而言之,我要做的是拥有一个(或多个)外部定义的闭包,我可以将其传递给createMarkup(),然后粘贴在树中的正确位置,即,我希望它产生这个:

<root>
  <someElement>
    <element y='uh oh' />
    <element key='value' />
    <element blah='123' />
    <element z='yeah' />
  </someElement>
</root>

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

找到解决方案:

nodes = { builder ->
  builder.element(key:'value')
  builder.element(blah:'123') 
}    

def createMarkup(additionalElements) {    
  def builder = new groovy.xml.MarkupBuilder()
  def result = builder.root{
    someElement(){
      element(y: 'uh oh')  
      additionalElements(builder)
      element(z: 'yeah')
    }
  }
}

createMarkup(nodes)

按预期工作。

答案 1 :(得分:0)

我猜additionalElements是封闭的。要执行它,您应该写:

additionalElements()

而不是:

additionalElements