这是我想要工作的代码
def expr = ''
List params = []
params << 'filter-name'
params << 'servlet-name'
params << 'url-pattern'
params.each{expr = expr+ "it.'${it}'.text().trim()#"}
expr = expr.substring(0, expr.length()-1)
consNodes.each{
println "data is:$"{expr}"
println "actual : ${it.'filter-name'.text().trim()}#${it.'servlet-name'.text().trim()}#${it.'url-pattern'.text().trim()}"
}
在上面的结果来了
data is:it.'filter-name'.text().trim()#it.'servlet-name'.text().trim()#it.'url-pattern'.text().trim()
actual : presenceLogoutFilter##/adfAuthentication/*
data is:it.'filter-name'.text().trim()#it.'servlet-name'.text().trim()#it.'url-pattern'.text().trim()
actual : remoteApplication##/rr/*
data is:it.'filter-name'.text().trim()#it.'servlet-name'.text().trim()#it.'url-pattern'.text().trim()
actual : ServletADFContextFilter#GetHandler#
data is:it.'filter-name'.text().trim()#it.'servlet-name'.text().trim()#it.'url-pattern'.text().trim()
actual : ServletADFContextFilter##/PresenceServlet/*
所以,你可以看到我构造的表达式无法进一步评估 . 有关如何使其工作的任何建议?
1 回答
问题是你正在创建一个
GString
这样:"it.'${it}'.text().trim()#"
,但是当你连接它时,你将它转换为String
:expr + "it.'${it}'.text().trim()#"
. 将GString
转换为String
后,它不再评估表达式 . 但即使你提出它也无法解决你的问题,因为GString
不会像你认为的那样进行评估 . 解释它的最好方法是举个例子:如果你真的想,你可以手动构建
GString
,但这将非常困难 . 而且你最终取决于一个不保证在Groovy版本之间保持向后兼容的类 .以下是您可以做的事情:
输出如下所示:
您可以使用一个闭包列表代替单个大型表达式,每个闭包都负责评估节点属性 . 然后,您可以使用'#'加入结果 .