Groovy>嵌套映射到Xml

Nic*_*aly 5 xml groovy

我想Map在Groovy中将我的对象转换为Xml.我已经浏览了当前的例子,我认为这会简单得多!

所有样品我发现,无论是使用一个MarkupBuilder手动指定的字段,或有一个实用的方法遍历树.最令人发指的!

有什么我想念的吗?我可以简单地转换这些其他格式......

JsonOutput.prettyPrint(JsonOutput.toJson(map))    // json
(map as ConfigObject).writeTo(new StringWriter()) // groovy
new Yaml().dump(map, new StringWriter())          // yml
Run Code Online (Sandbox Code Playgroud)

为什么我不能这样做?

XmlUtil.serialize(map)
Run Code Online (Sandbox Code Playgroud)

(或者我如何将Map对象转换为Element/ Node/ GPathResult/ Writable对象?)

Groovy示例代码

def myMap = [
    key1: 'value1',
    key2: 'value2',
    key3: [
        key1: 'value1',
        key2: 'value2',
        key3: [
            key1: 'value1',
            key2: 'value2',
        ]
    ]
]
Run Code Online (Sandbox Code Playgroud)

首选输出

<root>
    <key1>value1</key1>
    <key2>value2</key2>
    <key3>
        <key1>value1</key1>
        <key2>value2</key2>
        <key3>
            <key1>value1</key1>
            <key2>value2</key2>
        </key3>
    </key3>
</root>
Run Code Online (Sandbox Code Playgroud)

tim*_*tes 7

你可以做:

import groovy.xml.*

new StringWriter().with { sw ->
    new MarkupBuilder(sw).with {
        root { 
            myMap.collect { k, v ->
                "$k" { v instanceof Map ? v.collect(owner) : mkp.yield(v) }
            }
        }
    }
    println sw.toString()
}
Run Code Online (Sandbox Code Playgroud)

要输出:

<root>
  <key1>value1</key1>
  <key2>value2</key2>
  <key3>
    <key1>value1</key1>
    <key2>value2</key2>
    <key3>
      <key1>value1</key1>
      <key2>value2</key2>
    </key3>
  </key3>
</root>
Run Code Online (Sandbox Code Playgroud)

你知道没有可以调用的神奇方法(可能是因为属性,没有魔术贴图 - > xml转换可以在不知道所需输出结构的情况下完成)