Yokohama.groovy #7 に参加しました
2012/10/30 Yokohama.groovy #7 #yokohamagroovy - Togetterまとめ
ポツポツと参加者以外の方からも興味をもたれ始めている様子の Yokohama.groovy の 7 回目を実施してきました。
珍しく一番乗りでした。
いつもはビールですが気分を変えてウィスキー飲みつつ開始です。
今回の範囲
- 作者: 関谷和愛,上原潤二,須江信洋,中野靖治
- 出版社/メーカー: 技術評論社
- 発売日: 2011/07/06
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 392回
- この商品を含むブログ (155件) を見る
groovy.xml.MarkupBuilder
リスト 4.3
import groovy.xml.MarkupBuilder def xml = new MarkupBuilder() xml.Products() { Product(type:'regular'){ Name('Instant Noodle') Price(147) } }
<Products> <Product type='regular'> <Name>Instant Noodle</Name> <Price>147</Price> </Product> </Products>
同じ XML を出力するJava のサンプルコードも載っていましたが、コード量は段違いに多かったです。
ただ、コード量が少ない事よりもコードと XML との対応が非常に分かりやすく書けるのがいいなあと思いました。
表示系のメソッドを読んでいないのに XML が表示されるのは、引数無しコンストラクタの説明に"Prints markup to System.out"とあるように仕様です。
引数有りを試してみたのがこちら。出力結果は同じです。
import groovy.xml.MarkupBuilder def sw = new StringWriter() def xml = new MarkupBuilder(sw) xml.Products() { Product(type:'regular'){ Name('Instant Noodle') Price(147) } } println sw
疑問
サンプルコードを見ると、XML の各要素名のメソッドに各属性を渡して呼び出しているように見えます。
青本によると "ビルダーは Groovy のクロージャとメタプログラミングの機能を巧妙に組み合わせて作られて" いるそうです。
メタプログラミング機能によって存在しないメソッドが呼ばれた時の処理を定義しているみたい。
勉強会とは別に中身を確認してみようと思います。
groovy.util.XmlParser と groovy.util.XmlSlurper
XmlParser (Groovy 2.4.5)
XmlSlurper (Groovy 2.4.5)
どちらも XML を処理するためのパーサーです。
XmlParser はメモリ上に全要素を保持して処理し、XmlSlurper はストリーミングとして処理します。
ビルダーで時間を使ってしまったのでさらっとしかできませんでした。