我有一个问题,我正在尝试在groovy中动态创建嵌套的xml节点。当我说动态时,我的意思是使用StringTokenizer,所以传入一个字符串“a.b”,就会得到一个这样的节点:
<a>
<b></b>
</a>
我已经有以下代码可以创建一个包含值和属性的节点(使用MarkupBuilder和StringWriter)
"${node.node_name}"(node.attributes, node.value);
如果我用
替换它a{b()}
这将是一个嵌套节点,但我需要动态创建节点。我猜我会使用StringTokenizer并做类似的事情
while(tokenizer.hasMoreElements()) {
final String nodeName = tokenizer.nextToken();
if(tokenizer.hasMoreElements()) {
// create child node
} else {
// add value and attribute to final nested node
"${nodeName}"(node.attributes, node.value);
}
}
感谢您的帮助。
答案 0 :(得分:1)
您可以使用inject
执行此操作以构建一个Closures链,在运行时会生成xml:
import groovy.xml.MarkupBuilder
def property = 'a.b.c.d.e.f'
def leafProperties = [id:10, something:'else']
def writer = new StringWriter()
new MarkupBuilder(writer).with { xml ->
property.split(/\./).reverse().inject(null) { c, p ->
c ? { x -> xml."$p"(c) } : { x -> xml."$p"(leafProperties) }
}()
}
println writer.toString()