Groovy MarkupBuilder

时间:2014-05-06 06:43:47

标签: groovy markupbuilder

我有一个列表,每个都可能是foo或bar。我想构建一些看起来像这样的xml:

<rdf:RDF>
  <foo id="1">
  <foo id="2">
  <bar id="3">
</rdf:RDF>

所以我已经走到了这一步:

MarkupBuilder xml = new MarkupBuilder(writer)
  xml.'rdf:RDF' (nsmap) { }

但现在我被卡住了。我如何 - 在xml.'rdf:RDF' (nsmap) { }闭包内 - 迭代我的列表?我如何 - 在迭代器中 - 吐出一个foo或bar元素(如果适用)?

3 个答案:

答案 0 :(得分:2)

你可能会想到它更简单。在xml闭包中包含一个循环,然后在循环中包含标记。这个脚本......

import groovy.xml.MarkupBuilder

things = ['foo','foo','bar']
writer = new StringWriter()

xml = new MarkupBuilder(writer)
xml.'rdf:RDF' {
    things.eachWithIndex {thing,index ->
        "$thing" id:index+1
    }
}

println writer

...将产生以下输出:

<rdf:RDF>
  <foo id='1' />
  <foo id='2' />
  <bar id='3' />
</rdf:RDF>

答案 1 :(得分:1)

你走了:

import groovy.xml.MarkupBuilder
import org.custommonkey.xmlunit.*

def data = [foo:1,bar:2,baz:3]

def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.'rdf:RDF' {
    data.each { e ->
        "$e.key"(id:e.value)
    }
}
println writer

答案 2 :(得分:0)

确定。

问题是当构建器运行闭包时,它在构建器的上下文中运行。现在,事实证明构建器上下文隐藏了方法,但不隐藏变量。这意味着您可以创建一个闭包,将其分配给变量,并从构建器中访问它。

否则,我得到的印象是,这个闭包也是在构建器的上下文中运行的。但我怀疑你可以将“this”分配给闭包之外的变量,然后访问该变量以获取上下文。

你必须遇到这种麻烦是荒谬的。我想起了早在90年代的Microsoft Access编码。它很有效,直到你想要做的事情超过严格设计的时候。