我有一个groovy scipt在我的应用程序中扮演配置角色。它的结构将是这样的:
a{
b=val1
c{
d=val2
}
}
e{
f=val3
}
如何迭代此配置中的enties以将一个root的设置与另一个root的设置分开?我的意思是这种迭代方式,我将能够确定根位置,如下所示:
a (root)
b
c (subroot)
d
e (root)
f
并且配置级别不受2级限制,因此使用简单的内部'for'循环进行迭代是不合适的,因为我不会在编译时有多少级别。
答案 0 :(得分:2)
你的意思是这样吗?
给定配置:
def cfg = '''
a {
b = 'val1'
c {
d = 'val2'
}
}
e {
f = 'val3'
}'''
您可以定义递归walk
方法,如下所示:
def walk( map, root=true ) {
map.each { key, value ->
if( value instanceof Map ) {
println "$key (${root?'root':'subroot'})"
walk( value, false )
}
else {
println "$key"
}
}
}
然后调用该函数,传入slurped config:
walk( new ConfigSlurper().parse( cfg ) )
打印:
a (root)
b
c (subroot)
d
e (root)
f
您也可以将配置放在文件中(在此示例中为Config.groovy
)
然后,您可以将walk
调用更改为:
walk( new ConfigSlurper().parse( Config ) )
它将输出相同的