在运行时计算groovy字符串表达式

在运行时计算groovy字符串表达式,groovy,groovyshell,Groovy,Groovyshell,如果我有这样的代码(不起作用): xml属性的值是“时间是${new Date()}” 如何让Groovy在运行时计算这个表达式 使用上面的代码,我得到了“时间是${(new Date()})”而不是一个求值 谢谢你的任何想法……嗯。首先,作为Michael,我尝试过使用内联xml。但是groovy似乎可以将它们正确地当作GString来对待 因此,我设法用另一种方式使事情顺利进行: test.xml 对于纯Groovy shell解决方案,我认为我们可以将表达式包装在附加的“,但我还没有得到任

如果我有这样的代码(不起作用):

xml属性的值是“时间是${new Date()}”

如何让Groovy在运行时计算这个表达式

使用上面的代码,我得到了“时间是${(new Date()})”而不是一个求值


谢谢你的任何想法……

嗯。首先,作为Michael,我尝试过使用内联xml。但是groovy似乎可以将它们正确地当作GString来对待

因此,我设法用另一种方式使事情顺利进行:

test.xml


对于纯Groovy shell解决方案,我认为我们可以将表达式包装在附加的
,但我还没有得到任何解决方案。

您还可以使用以下代码:

def value = element.getAttribute("value")
Binding binding = new Binding()
binding.setVariable("valueExpression", "\"$value\"")
binding.setVariable("a", 10)
binding.setVariable("b", 20)
def interpolatedValue = new GroovyShell(binding).evaluate(
    "return evaluate(valueExpression)")
println ("interpolated Value = $interpolatedValue")
我正在使用以下元素测试上述代码:

The time is ${new Date()} and $a + $b is ${a+b}
结果是:

interpolated value = The time is Wed Feb 26 10:00:00 2014 and 10 + 20 is 30

使用您的代码,binding.setVariable(“valueExpression”,“value\”)只是将valueExpression设置为文本“value”,而不是“value”中包含的表达式"您确定按预期方式粘贴了它吗?抱歉,我缺少美元字符。我正在做的是将原始值用引号括起来,使其再次成为GString,并在绑定中重新计算它。我正在使用现有的基于xml的测试脚本框架,因此我需要在从中捕获表达式的范围内使用一个XML属性…如果我从头开始,我会使用模板。实际上,我甚至不会使用XML:)我可能错误地理解了您想要实现的目标。为了简单起见,我提供了基于xml元素的示例,但现在我编辑了一个答案,向您展示了完整的工作示例。请注意,与新手相反,此解决方案可以在属性文本中正确保留
。它比简单地在每个属性中添加
更聪明。在其他情况下,并没有什么不同,您可以使用任何api从任何源获取字符串,然后将其传递给模板,并以字符串的形式获得预期结果。如果你的意思是smth other,请澄清。我最终也使用了模板,我的代码与之类似。
5
"5"
Wed Feb 26 23:01:02 MSK 2014
9
def value = element.getAttribute("value")
Binding binding = new Binding()
binding.setVariable("valueExpression", "\"$value\"")
binding.setVariable("a", 10)
binding.setVariable("b", 20)
def interpolatedValue = new GroovyShell(binding).evaluate(
    "return evaluate(valueExpression)")
println ("interpolated Value = $interpolatedValue")
The time is ${new Date()} and $a + $b is ${a+b}
interpolated value = The time is Wed Feb 26 10:00:00 2014 and 10 + 20 is 30