3

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

def value = element.getAttribute("value")
Binding binding = new Binding();
binding.setVariable("valueExpression", value);
def interpolatedValue = new GroovyShell(binding).evaluate("return valueExpression")
println ("interpolated Value = $interpolatedValue")

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

如何让 Groovy 在运行时评估这个表达式?

使用上面的代码,我得到“时间是 ${(new Date()}”而不是评估……。

感谢您的任何想法……

4

2 回答 2

1

唔。首先,作为迈克尔,我尝试过使用内联 xml。但看起来,groovy 可以正确地将它们视为 GString。

所以,我已经设法使用另一种方式使事情起作用:模板

def xml = new XmlSlurper().parse("test.xml")
def engine = new groovy.text.SimpleTemplateEngine()
def value = xml.em."@value".each { // iterate over attributes
    println(engine.createTemplate(it.text()).make().toString())
}

测试.xml

<root>
    <em value="5"></em>
    <em value='"5"'></em>
    <em value='${new Date()}'></em>
    <em value='${ 5 + 4 }'></em>
</root>

输出

5
"5"
Wed Feb 26 23:01:02 MSK 2014
9

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

于 2014-02-26T08:52:34.950 回答
0

您还可以使用以下代码:

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
于 2014-02-26T09:30:28.633 回答