在groovy中创建嵌套的xml

时间:2015-08-10 10:40:52

标签: xml groovy

我有一个问题,我正在尝试在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);
     }
}

感谢您的帮助。

1 个答案:

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