我有一个列表,每个都可能是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元素(如果适用)?
答案 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编码。它很有效,直到你想要做的事情超过严格设计的时候。