Groovy > 嵌套映射到 Xml
Groovy > Nested Map to Xml
我想将我的 Map
对象转换为 Groovy 中的 Xml。我浏览了当前的示例,我认为这会简单得多!
我找到的所有样本,要么使用 a MarkupBuilder
to manually specify the fields, or have a utility method to iterate over the tree。最可恶!
有什么我想念的吗?我可以简单地转换这些其他格式...
JsonOutput.prettyPrint(JsonOutput.toJson(map)) // json
(map as ConfigObject).writeTo(new StringWriter()) // groovy
new Yaml().dump(map, new StringWriter()) // yml
为什么我做不到?
XmlUtil.serialize(map)
(或者如何将我的 Map
对象转换为 Element
/Node
/GPathResult
/Writable
对象?)
Groovy 示例代码
def myMap = [
key1: 'value1',
key2: 'value2',
key3: [
key1: 'value1',
key2: 'value2',
key3: [
key1: 'value1',
key2: 'value2',
]
]
]
首选输出
<root>
<key1>value1</key1>
<key2>value2</key2>
<key3>
<key1>value1</key1>
<key2>value2</key2>
<key3>
<key1>value1</key1>
<key2>value2</key2>
</key3>
</key3>
</root>
你可以这样做:
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()
}
要输出:
<root>
<key1>value1</key1>
<key2>value2</key2>
<key3>
<key1>value1</key1>
<key2>value2</key2>
<key3>
<key1>value1</key1>
<key2>value2</key2>
</key3>
</key3>
</root>
没有我知道的可以调用的魔术方法(可能是因为由于属性,没有魔术图 -> xml 可以在不知道所需输出结构的情况下完成转换)
我想将我的 Map
对象转换为 Groovy 中的 Xml。我浏览了当前的示例,我认为这会简单得多!
我找到的所有样本,要么使用 a MarkupBuilder
to manually specify the fields, or have a utility method to iterate over the tree。最可恶!
有什么我想念的吗?我可以简单地转换这些其他格式...
JsonOutput.prettyPrint(JsonOutput.toJson(map)) // json
(map as ConfigObject).writeTo(new StringWriter()) // groovy
new Yaml().dump(map, new StringWriter()) // yml
为什么我做不到?
XmlUtil.serialize(map)
(或者如何将我的 Map
对象转换为 Element
/Node
/GPathResult
/Writable
对象?)
Groovy 示例代码
def myMap = [
key1: 'value1',
key2: 'value2',
key3: [
key1: 'value1',
key2: 'value2',
key3: [
key1: 'value1',
key2: 'value2',
]
]
]
首选输出
<root>
<key1>value1</key1>
<key2>value2</key2>
<key3>
<key1>value1</key1>
<key2>value2</key2>
<key3>
<key1>value1</key1>
<key2>value2</key2>
</key3>
</key3>
</root>
你可以这样做:
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()
}
要输出:
<root>
<key1>value1</key1>
<key2>value2</key2>
<key3>
<key1>value1</key1>
<key2>value2</key2>
<key3>
<key1>value1</key1>
<key2>value2</key2>
</key3>
</key3>
</root>
没有我知道的可以调用的魔术方法(可能是因为由于属性,没有魔术图 -> xml 可以在不知道所需输出结构的情况下完成转换)