如果您将闭包更改string
为(我将其称为是builder
因为我不喜欢将小写的类名作为属性名)
def builder = { ->
node1 {
node2{
node3()
}
}
}
然后你可以这样做StreamingMarkupBuilder
:
String output = new groovy.xml.StreamingMarkupBuilder().bind {
builder.delegate = delegate
builder()
}.toString()
并将output
包含字符串:
<node1><node2><node3/></node2></node1>
编辑:
看起来我误解了,param
变量是一个字符串。在这种情况下,您可以执行此操作来评估字符串(包装在闭包中)并执行与上述相同的操作:
def param = "node1 { node2 { node3() } }"
String output = new groovy.xml.StreamingMarkupBuilder().bind { smb ->
Eval.me( "{ -> $param }" ).with { c ->
c.delegate = smb
c()
}
}.toString()
然而,应该注意的是,在使用 Eval 做任何事情时必须小心。它不会关心代码是恶意的还是良性的,它只会运行它,可能会使您的应用程序崩溃或删除代码或更糟。
也许您可以构建地图或其他东西,而不是构建字符串?然后你可以做这样的事情:
def param = [ node1:[ node2:[ node3:'' ] ] ]
String output = new groovy.xml.StreamingMarkupBuilder().bind {
param.each { k, v ->
"$k" { v instanceof Map ? v.each( owner ) : mkp.yield( v ) }
}
}