MarkupBuilderで要素の定義を別で定義したい。
少しタイトルが変わってますが、MarkupBuilderで要素の作成を別メソッドにする方法がわからない。 - 旧山pの楽しいお勉強生活の続き。
前回、delegateを使用することでクロージャを外部に定義する方法がわかった。
import groovy.xml.MarkupBuilder def xml = new MarkupBuilder() def c = {n -> car{ name(n) } } c.delegate = xml xml.root(){ id(1) user { name("yamada") c("car1") } company { name("kaisha") c("car2") } }
これでクロージャを使いまわしていい感じにできる!っと思ったけど、実際に使ってみるとuserもcompanyも外で定義したい。
というか、root自体も定義しておきたいので定義してみる。
出力したい内容
<?xml version='1.0' encoding='UTF-8'?> <root> <id>1</id> <user> <name>yamada</name> <car> <name>car1</name> </car> </user> <company> <name>kaisha</name> <car> <name>car2</name> </car> </company> </root>
import groovy.xml.MarkupBuilder import groovy.xml.MarkupBuilderHelper def c = {n -> car{ name(n) } } def u = { n, cn -> user { name(n) c(cn) } } def com = { n, cn -> company { name(n) c(cn) } } def r = { root(){ id(1) u("yamada","car1") com("kaisha", "car2") } } def xml = new MarkupBuilder() new MarkupBuilderHelper(xml).xmlDeclaration(version:'1.0',encoding:'UTF-8') [c,r,u,com].each{it.delegate = xml} r()
確かにそれぞれで定義はできているし、使いまわせるけどdelegateを設定するのがカッコ悪い。
もう少しいい方法があると思うんだけど。。。