繁体   English   中英

Groovy MarkupBuilder

[英]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元素(如适用)?

您可能会认为它更简单。 在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>

干得好:

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

好。

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

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

您必须去解决这种麻烦,这很荒谬。 我想起了90年代Microsoft Access中的编码。 效果很好,直到您想要做的事情比严格设计的要多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM