【问题标题】:Using external string variable with Groovy Markup Builder在 Groovy Markup Builder 中使用外部字符串变量
【发布时间】:2014-03-19 12:48:19
【问题描述】:

我使用 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>

谢谢

【问题讨论】:

  • 我不明白你想要什么。您能否添加更多详细信息。你有什么,你想达到什么?
  • 我想让脚本有一个使用字符串中包含的节点的 XMl 输出。

标签: groovy markupbuilder


【解决方案1】:

如果您将闭包 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 ) }
    }
}

【讨论】:

  • 嗨,蒂姆,感谢您的回答,只是需要更多帮助。我已经淡化了我的示例,闭包构建器的定义不是一步完成的,而是几个 if 语句和循环的产物。有什么方法可以让我使用原始问题中的参数字符串作为起点,然后将其转换为闭包并按照您所说的方式使用?
  • 对不起,让我再说一遍。你有一个叫做 builder 的闭包。在我的代码中,我在几个条件语句和循环等的乘积之后将其作为字符串,是否可以将此字符串转换为闭包,然后使用您给出的代码?
  • 您的意思是param 在您的问题中应该是一个字符串?您将其作为问题中方法调用的结果。
  • 是的,它是一个字符串,我现在试图澄清原来的问题,抱歉。这可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
相关资源
最近更新 更多