クロージャーを次のように変更した場合 (小文字のクラス名をプロパティ名として使用することに熱心ではないため、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
変数は文字列です。その場合、これを実行して (クロージャにラップされた) String を評価し、上記とほとんど同じことを行うことができます。
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 ) }
}
}