0

我有一个东西的清单,每一个都可能是 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 元素?

4

3 回答 3

2

干得好:

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
于 2014-05-06T07:55:52.253 回答
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>
于 2014-05-06T08:03:26.560 回答
-1

好的。

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

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

你必须去遇到这种麻烦是荒谬的。我想起了 90 年代 Microsoft Access 中的编码。它工作得很好,直到你想做的事情超出了严格设计的范围。

于 2014-05-06T08:04:03.253 回答