gpt4 book ai didi

xml - 如何使用 Groovy 的 MarkupBuilder 呈现列表

转载 作者:数据小太阳 更新时间:2023-10-29 02:20:52 25 4
gpt4 key购买 nike

我正在使用 Groovy MarkupBuilder 将 map 转换为 XML .此映射可以包含简单的键/值对、其他映射或映射列表。我从代码中搭便车 here .

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>

我试过摆弄 key 的位置,但无济于事。我是不是做错了,或者我不应该使用构建器?

最佳答案

我想这会做你想做的。前两个重载接受一个映射或集合,并返回一个组合的闭包,该闭包可以传递给封闭元素的构建器方法,以将映射或集合的内容添加到构建器。

第三个是回退,只返回其参数,以便将它们传递给构建器方法。这处理字符串,但如果需要,您也可以将其传递给闭包。作为示例,我替换了您提供的 map 中的第二个 option 元素。

ComposedClosure在 Groovy 1.8 中添加,因此这在早期版本中不起作用。

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()

关于xml - 如何使用 Groovy 的 MarkupBuilder 呈现列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13095486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com