4

目標: 以下の 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 プロジェクトに送信します。そうなる前に確認したいだけです。これが次のステップだと思う場合は、コメントしてください。

4

2 に答える 2

1

申し訳ありませんが、私は間違っているかもしれませんが、 XmlUtil.serialize はあなたが望むものをカバーしていると思います。

MrHaki: groovy-goodness-pretty-print-xml

しばらく前にプラグインとしてリリースする予定だった作業を行いましたが、最終的にはリリースしませんでした。最終的に機能しなかったオンザフライ更新のdnsでサイドトラックされました。とにかくxmlコントローラーを処理し、gspビューに従ってください。しかし、MrHakiはそれをよりエレガントに表現し、いくつかの本当に良い例を持っていると思います.

于 2015-12-16T22:05:22.690 に答える
1

試してみてくださいgrails.converters.XML。あなたの場合:

def myInfoMap = [
        firstname: 'firstname',
        lastname : 'lastname',
        relatives: [
                mother: "mom",
                father: "dad"
        ]
]

println new grails.converters.XML(myInfoMap)

次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<map>
    <entry key="firstname">firstname</entry>
    <entry key="lastname">lastname</entry>
    <entry key="relatives">
        <entry key="mother">mom</entry>
        <entry key="father">dad</entry>
    </entry>
</map>
于 2015-12-16T12:19:20.413 に答える