[英]How to render a List with Groovy's MarkupBuilder
我正在使用Groovy MarkupBuilder將Map轉換為XML。 此地圖可以包含簡單的鍵/值對,其他地圖或地圖列表。 我正在從這里的代碼中捎帶。
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封裝兩個選項,如下所示:
<select>
<option>foo1</option>
<option>foo2</option>
</select>
我試過玩鑰匙放置,但無濟於事。 我是不是錯了,或者我不應該使用建設者?
我想這會做你想要的。 前兩個重載采用映射或集合,並返回一個組合閉包,該閉包可以傳遞給封閉元素的構建器方法,以將地圖或集合的內容添加到構建器。
第三個是回退,只返回其參數,以便將它們傳遞給構建器方法。 這會處理字符串,但如果需要,您也可以將其傳遞給它。 我替換了您提供的地圖中的第二個option
元素作為示例。
在Groovy 1.8中添加了ComposedClosure
,因此在早期版本中不起作用。
import groovy.xml.MarkupBuilder
Closure buildxml(final Map map)
{
final compose = { f, tag, content -> f >> { "$tag"(buildxml(content)) } }
return map.inject(Closure.IDENTITY, compose)
}
Closure buildxml(final Collection col)
{
final compose = { f, content -> f >> buildxml(content) }
return col.inject(Closure.IDENTITY, compose)
}
def buildxml(final content)
{
return content
}
def map = [
key1:'value1',
key2:'value2',
nestedMap : [
key1:'bar1',
key2:'bar2'
],
select : [
[option:'foo1'],
{ option('foo2') },
],
]
final writer = new StringWriter()
final builder = new MarkupBuilder(writer)
builder.root buildxml(map)
assert writer as String == '''\
<root>
<key1>value1</key1>
<key2>value2</key2>
<nestedMap>
<key1>bar1</key1>
<key2>bar2</key2>
</nestedMap>
<select>
<option>foo1</option>
<option>foo2</option>
</select>
</root>'''.stripIndent()
不
case List:
"${entry.key}" entry.value.collect {
renderMap it
}
break
帶你去哪兒? 雖然不是在電腦上檢查atm,但感覺對嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.