我确定这是一个简单的......
我们使用Groovy模板引擎将XML文档格式化为人类可读的形式。代码扫描XML并创建一个映射,其中包含XML中每个项的条目,然后将其传递给Groovy模板引擎。
当XML包含与类名匹配的属性时,会出现问题 -
像这样:<Date>some date</Date>
。如果模板文件指定Date is $Date
(例如),而不是实际的日期字符串,我们将获得class java.util.Date
。我们尝试过$Date
${Date}
和${Date.toString()}
之类的变体,但没有运气。
我们认为问题在于Groovy将Date与输入变量和java.util.Date类混淆,但我确定有某种语法可以使其正常工作。由于我们通过这个提供任意用户定义的XML,我们实际上无法控制XML中的属性名称。
这里有几行代码来复制问题:
def map = [:]
map.putAt("Date", new Date()) // Fails
map.putAt("Date2", new Date()) // Works
def tf = new File("Test.template")
def gte = new GStringTemplateEngine()
def tpl = gte.createTemplate(tf).make(map.withDefault{null})
println tpl.toString()
&#34; Test.template&#34;文件包含:
Date is ${Date.toString()}.
Date is ${Date2.toString()}.
我们获得的输出是:
Date is class java.util.Date.
Date is Tue Jun 06 20:22:16 EDT 2017.
答案 0 :(得分:0)
是的,似乎groovy在绑定名为Date
的变量
Date
那么,为什么不将所有xml属性作为一个绑定变量传递:
def map = [:]
map.putAt("Date", new Date()) // Fails
map.putAt("Date2", new Date()) // Works
def gte = new groovy.text.GStringTemplateEngine()
def tpl = gte.createTemplate('''
Date :: ${ctx.Date.toString()}
Date2 :: ${ctx.Date2.toString()}
''').make( [ctx:map].withDefault{null})
println tpl.toString()
也可以通过这种访问者delegate.'My strange Variable'
访问变量:
def map = [:]
map.putAt("Date", new Date()) // Fails
map.putAt("Date2", new Date()) // Works
def gte = new groovy.text.GStringTemplateEngine()
def tpl = gte.createTemplate('''
Date :: ${delegate.'Date'.toString()}
Date2 :: ${Date2.toString()}
''').make( map.withDefault{null})
println tpl.toString()
答案 1 :(得分:0)
在这里回答我自己的问题,以防其他人遇到类似的问题。
我们发现Groovy“getVariable()”方法是一个适合我们的解决方案。 getVariable()方法返回任何变量的值,并在模板引擎中公开。将上面示例中的模板更改为:
Date is ${getVariable("Date")}
解决了我们的问题。