目標: 以下の myInfoObject 定義を前提として、これを実行できるようにしたいと考えています。
println new groovy.xml.MarkupBuilder(myInfoObject).toPrettyString()
前提:
以下は、私のユース ケースにおける Groovy の最も驚くべき便利な機能の 1 つです。オブジェクトを渡すだけで、JSON を取得できます。
例 - マップ内の単純なマップ
import groovy.json.*
def myInfoMap = [
firstname : 'firstname',
lastname : 'lastname',
relatives : [
mother : "mom",
father : "dad"
]
]
myInfoJson = new JsonBuilder(myInfoMap)
//One line, straight to JSON object, no string writer/parser conversions
//Works on any object, extremely elegant, even handles deep nesting
//Alternatively, add .toPrettyString() for the string representation
戻り値:
{
"firstname": "firstname",
"lastname": "lastname",
"relatives": {
"mother": "mom",
"father": "dad"
}
}
見つけたすべての MarkupBuilder の例とドキュメントを読みましたが、XML に相当するものはないようです。これは私が見つけた最も近いもので、ほぼ同じではありません。 http://www.leveluplunch.com/groovy/examples/build-xml-from-map-with-markupbuilder/
XML と JSON は根本的に異なりますが、オブジェクトが同様の方法で XML によって表されることは依然として一般的です。同等の XML には、データの表現方法を指定するオプションのパラメーターが少なくとも 1 つ必要ですが、適切なデフォルトは次のようになると思います。
<myInfoMap>
<firstname>firstname</firstname>
<lastname>lastname</lastname>
<relatives>
<relative>
<mother>mom</mother>
</relative>
<relative>
<father>dad</father>
</relative>
</relatives>
</myInfoMap>
...構造を熟知した上で手動で構築する必要があります...
def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder(writer)
builder.myInfoMap {
myInfoMap.each{key, value ->
if (value instanceof Map){
"${key}"{
value.each{key2, value2 ->
"${key[0..key.size()-2]}"{
"${key2}" "${value2}"
}
}
}
}else{
"${key}" "${value}"
}
}
}
println writer.toString()
賢くして少し動的にすることも試みましたが、単純なケースであっても、JSONBuilder の例とはかけ離れていることがわかります。
これが現在不可能で、誰のレーダーにもない場合は、機能リクエストとして最初の JIRA チケットを Groovy プロジェクトに送信します。そうなる前に確認したいだけです。これが次のステップだと思う場合は、コメントしてください。