Skip to content

Instantly share code, notes, and snippets.

@kimukou
Forked from fumokmm/keyValueXml.groovy
Created March 16, 2011 19:34
Show Gist options
  • Save kimukou/873150 to your computer and use it in GitHub Desktop.
Save kimukou/873150 to your computer and use it in GitHub Desktop.
/**
* Created by IntelliJ IDEA.
* User: kyon
* Date: 11/03/15
* Time: 0:54
* To change this template use File | Settings | File Templates.
*/
/*
class KeyValue {
def key
def value
KeyValue(key, value){
this.key = key
this.value = value
}
}
*/
class KeyValue {
KeyValue(){}
KeyValue(key,value){setProperty(key,value) }
KeyValue(properties_){properties=properties_}
Set<String> keySet(){properties.keySet()}
def properties = [:]
Object getProperty( String property ) {
//println "read from property $property"
properties[ property ]
}
void setProperty( String property, Object newValue ) {
//println "wrote to property $property/$newValue"
properties[ property ] = newValue
}
}
def convert(def builder, List list, boolean first = true) {
if (first) {
builder.langs(type: 'current') {
convert(builder, list, false)
}
return
}
//else {
list.each { kv->
//println kv.dump()
kv.keySet().each{key->
def value=kv."$key"
//println value.getClass()
switch(value.getClass()){
case List:
builder."$key" {
convert(builder,value, false)
}
break
case Map:
builder."$key"{
convert(builder,value)
}
break
case Set://attribute対応
def val
def attr=[:]
value.each{
if(it.contains(":")){
arr = it.split(":")
attr.put(arr[0],arr[1])
}
else{
val = it
}
}
builder."$key"(val,attr)
break
default:
builder."$key"(value)
break
}
}
/*
if (kv.value instanceof List)
builder."${kv.key}" {
convert(builder, kv.value, false)
}
else
builder."${kv.key}"(kv.value)
*/
}
//}
}
def convert(def builder, Map kv){
kv.keySet().each{key->
def value=kv."$key"
//println value.getClass()
switch(value.getClass()){
case List:
builder."$key" {
convert(builder,value, false)
}
break
case Map:
builder."$key"{
convert(builder,value)
}
break
case Set://attribute対応
def val
def attr=[:]
value.each{
if(it.contains(":")){
arr = it.split(":")
attr.put(arr[0],arr[1])
}
else{
val = it
}
}
builder."$key"(val,attr)
break
default:
builder."$key"(value)
break
}
}
}
def sw = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(sw)
xml.doubleQuotes = true // 属性はダブルクォートだよね!
/*
def list = [
new KeyValue("key1","value1"),
new KeyValue("key2","value2"),
new KeyValue("key3", [
new KeyValue("key3-1","value3-1"),
new KeyValue("key3-2","value3-2")
])
]
*/
def list = [
new KeyValue("key1":"value1"),
//new KeyValue("key2":"value2"),
new KeyValue("key2":["value2","id:5555"] as Set),
new KeyValue("key3", [
//new KeyValue("key3-1":"value3-1"),
//new KeyValue("key3-2":"value3-2")
"key3-1":"value3-1",
"key3-2":"value3-2",
"key3-3":
[
"key3-3-1":["value3-3-1","id:1234","name:tacohachi", "birthday:1970-10-13"] as Set,
"key3-3-2":"value3-3-2"
]
])
]
def expect = """
<langs type="current">
<key1>value1</key1>
<key2 id="5555">value2</key2>
<key3>
<key3-1>value3-1</key3-1>
<key3-2>value3-2</key3-2>
<key3-3>
<key3-3-1 id="1234" birthday="1970-10-13" name="tacohachi">value3-3-1</key3-3-1>
<key3-3-2>value3-3-2</key3-3-2>
</key3-3>
</key3>
</langs>
"""
/*
def expect = """\
<langs type="current">
<key1>value1</key1>
<key2>value2</key2>
<key3>
<key3-1>value3-1</key3-1>
<key3-2>value3-2</key3-2>
</key3>
</langs>"""
*/
convert(xml, list)
//println sw.toString()
//println expect
//このassertコードだと、改行コードがあってもNGになるはず!
//assert sw.toString() == expect
//attribute判定が出来ない><
//langs = new XmlSlurper().parseText(sw.toString())
//assert langs==new XmlSlurper().parseText(expect)
//こちら側は可能
langs = new XmlParser().parseText(sw.toString())
assert langs.toString() ==new XmlParser().parseText(expect).toString()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment