私は、Groovy のStreamingMarkupBuilderを使用して、いくつかの SQL クエリの結果に基づいて動的に XML を生成しています。クロージャーの内部からメソッドを呼び出したいのですが、マークアップ ビルダーはメソッド名を使用して XML ノードを作成しようとします。
これが私がやろうとしていることの例です:
Map generateMapFromRow(GroovyRowResult row) {
def map = [:]
def meta = row.getMetaData()
// Dynamically generate the keys and values
(1..meta.getColumnCount()).each { column -> map[meta.getColumnName(column)] = row[column-1] }
return map
}
def sql = Sql.newInstance(db.url, db.user, db.password, db.driver)
def builder = new StreamingMarkupBuilder()
def studentsImport = {
students {
sql.eachRow('select first_name, middle_name, last_name from students') { row ->
def map = generateMapFromRow(row) // Here is the problem line
student(map)
}
}
}
println builder.bind(studentsImport).toString()
これにより、次のような XML が生成されます。
<students>
<generateMapFromRow>
[first_name:Ima, middle_name:Good, last_name:Student]
</generateMapFromRow>
<student/>
<generateMapFromRow>
[first_name:Ima, middle_name:Bad, last_name:Student]
</generateMapFromRow>
<student/>
</students>
メソッドをクラスに移動し、クラスで静的に呼び出してみましたが、これも機能しません。
StreamingMarkupBuilder の仕組みの性質上、実際にこれを行うことはできないのではないかと心配していますが、そうであることを願っています。