読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

GroovyのMarkupBuilder用の文字列をXMLから生成するクラスを書きました

Groovy Builder XML

はじめに

GroovyにはMarkupBuilderというのがあって、GroovyのDSLを用いて簡単にXML(などのマークアップランゲージ全般)を作れるというもの。このブログでも前にこれとかこれとかで記事を書いています。さて、今回はこの逆をやってみようという話です。つまり

  • XMLを読み込む
  • 読み込んだXMLの内容からMarkupBuilderできるStringを作る

という流れです。

ということで書いたクラス

色々やり方を考えた結果、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クラスをいじればできるんですけど…(そ、そのうちやりますっ)。あと、複合要素とかあまり考えてませんので、どうなるかはわかりませ。こちらもそのうち…ひとまず簡易版ということでお許し下さい。