はじめに
GroovyにはMarkupBuilderというのがあって、GroovyのDSLを用いて簡単にXML(などのマークアップランゲージ全般)を作れるというもの。このブログでも前にこれとかこれとかで記事を書いています。さて、今回はこの逆をやってみようという話です。つまり
という流れです。
ということで書いたクラス
色々やり方を考えた結果、SAXでいいんじゃね?という結論に至ったので、ガツガツ書いてみました。
使い方
使い方は簡単、まず、XMLを用意する。例としてこんなの。
用意したXMLファイル
GroovyMarkupDSLHandlerを呼び出す準備
SAXParserは色々と手続きが面倒なので、
getDSLString(XMLファイル、ライター、インデント文字列)
って呼び出すだけで使えるメソッドを書いた。
import javax.xml.parsers.SAXParserFactory import org.xml.sax.helpers.DefaultHandler import org.xml.sax.InputSource def getDSLString(File xml, Writer w, String indent = ' ') { def handler = new GroovyMarkupDSLHandler(w, indent) def reader = SAXParserFactory.newInstance().newSAXParser().xmlReader reader.contentHandler = handler reader.parse(new InputSource(xml.newInputStream())) }
で、使ってみる
def sw = new StringWriter() // <- ここに結果が入る getDSLString(new File('test2.xml'), sw) println sw.toString() // <- 結果の文字列化
結果
root {
a(hoge: 'val1', fuga: 'val2') {
}
b {
}
c(hoge: 'val3') {
d {
mkp.yield('val4')
}
e {
f(hoge: 'val5') {
mkp.yield('ばりゅー6')
}
}
}
}
はいできました。ということで、出来上がった文字列は煮るなり焼くなり自由にお使い下さい。
おわりに
本当はmkp.yield('xxxxx') ってなっている部分は、例えば上記の例で行くと、
f(hoge: 'val5', 'ばりゅー6')
という風にした方がきっとイイですよね、GroovyMarkupDSLHandlerクラスをいじればできるんですけど…(そ、そのうちやりますっ)。あと、複合要素とかあまり考えてませんので、どうなるかはわかりませ。こちらもそのうち…ひとまず簡易版ということでお許し下さい。