我正在使用Groovy MarkupBuilder將地圖轉換爲XML。該地圖可以包含簡單的鍵/值對,其他地圖或地圖列表。我從代碼here捎帶。如何使用Groovy的MarkupBuilder呈現列表
import groovy.xml.MarkupBuilder
def map = [
key1:'value1',
key2:'value2',
nestedMap : [
key1:'bar1',
key2:'bar2'
],
select : [
[option:'foo1'],
[option:'foo2']
]
]
Closure renderMap(Map map){
return {
for (entry in map){
switch(entry.value.getClass()){
case Map :
"${entry.key}" renderMap(entry.value)
break
case List:
entry.value.collect { listEntry ->
"${entry.key}" renderMap(listEntry)
}
break
default :
"${entry.key}"("${entry.value}")
break
}
}
}
}
StringWriter writer = new StringWriter()
new MarkupBuilder(writer).root renderMap(map)
println writer.toString()
這部分我擔心打印出:
<select>
<option>foo1</option>
</select>
<select>
<option>foo2</option>
</select>
不過,我想知道如果有一種方式來獲得選擇封裝兩個選項,如下所示:
<select>
<option>foo1</option>
<option>foo2</option>
</select>
我試着玩弄鑰匙的位置,但無濟於事。我是否做過這一切都錯了,還是我不應該使用生成器?
因爲它不是3AM,所以能夠大幅簡化它。但Map和Collection的重載仍然會讓我感到一些困擾。他們看起來多餘,但我想不出有什麼辦法可以將它們組合起來,這比只使用兩種幾乎相同的方法更清潔。 –
非常乾淨優雅的答案,謝謝。 – Igor