0

我已经使用 groovy 中的一些逻辑创建了一个字符串变量,它反映了标记生成器中的刹车语法,但问题是您显然不允许在标记生成器中使用此字符串。我的代码的性质使它成为必要。我想知道是否有办法做类似下面的事情

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>

谢谢

4

1 回答 1

2

如果您将闭包更改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 ) }
    }
}
于 2014-03-19T13:07:15.200 回答