在Groovy标记生成器中使用外部字符串变量

在Groovy标记生成器中使用外部字符串变量,groovy,markupbuilder,Groovy,Markupbuilder,我使用groovy中的一些逻辑创建了一个字符串变量,该变量反映了MarkupBuilder中的braket语法,但问题是显然不允许在MarkupBuilder中使用此字符串。我的代码的性质使它成为必要。我想知道是否有一种方法可以做如下事情 def param = "node1{ node2{ node3() } }" def sw = new StringWriter() def xml = new groovy.xml.MarkupBuilder(sw) XML = xml.param 我

我使用groovy中的一些逻辑创建了一个字符串变量,该变量反映了MarkupBuilder中的braket语法,但问题是显然不允许在MarkupBuilder中使用此字符串。我的代码的性质使它成为必要。我想知道是否有一种方法可以做如下事情

def param = "node1{ node2{ node3() } }"
def sw = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(sw)

XML = xml.param
我知道上面的代码是不正确的,但是有没有一种方法可以达到我的目的呢?需要明确的是,param是一个字符串,它是另一段代码的产物。我希望得到一段XML,如下所示:

<node1><node2><node3/></node2><node1>


如果您将闭包
字符串更改为
(我称之为
builder
,因为我不喜欢使用小写的类名作为属性名),请感谢

然后,您可以使用
StreamingMarkupBuilder
执行此操作:

String output = new groovy.xml.StreamingMarkupBuilder().bind { 
    builder.delegate = delegate
    builder()
}.toString()
输出
将包含以下字符串:

<node1><node2><node3/></node2></node1>
然而,应该注意的是,在使用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 ) }
    }
}

我不明白你想要什么。你能补充更多细节吗。你有什么,你想实现什么?我想让脚本有一个XMl输出,使用字符串中包含的节点。嗨,蒂姆,谢谢你的回答,只需要多一点帮助。我已经淡化了我的示例,闭包生成器的定义不是一步完成的,而是几个if语句和循环的产物。有没有什么方法可以让我用我原始问题中的参数字符串作为起点,然后把它转换成一个闭包,然后用你刚才说的方式使用?对不起,让我重复一遍。您有一个名为builder的闭包。在我的代码中,这是一个字符串,在几个条件语句和循环等的乘积之后,是否可以将此字符串转换为闭包,然后使用您给出的代码?您的问题中的
param
应该是字符串?这是问题中方法调用的结果。是的,这是一个字符串,我现在试图澄清原始问题,对不起。这可能吗?
def param = "node1 { node2 { node3() } }"

String output = new groovy.xml.StreamingMarkupBuilder().bind { smb ->
    Eval.me( "{ -> $param }" ).with { c ->
        c.delegate = smb
        c()
    }
}.toString()
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 ) }
    }
}