前にやった「ビルダーの本末転倒な使い方」、「ビルダーの本末転倒な使い方 Reloaded」って、よく考えたら、「ビルダーをイベントハンドラと思えば単なる Push 解析」ですねぇ。
ってことで、サンプルコードをちょっと SAXParser 風にしてみると
class PushParser{ def parseText(String xml, builder){ parse(new StringReader(xml), builder) } def parse(Reader reader, builder){ def parser = new XmlParser() def xml = parser.parse(reader) buildNode(xml, builder) } def buildNode(node, builder){ def secondArg = (node.text()) ? node.text() : createContentClosure(node, builder) builder.invokeMethod(node.name(), [node.attributes(), secondArg]) } private createContentClosure(node, builder){ return { for(child in node.children()){ buildNode(child, builder) } } } }
といった感じになります。
このクラスを使用するコードはこんな感じ:
def xml = '''<table customer='c' invoice='i'> <join c='invoice_id' i='id' /> <and> <greater i.total='1000' /> <like c.name='%Bill%' >description</like> </and> </table>''' def parser = new PushParser() def builder = new groovy.xml.MarkupBuilder() parser.parseText(xml, builder)
ビルダーをインスタンスに持つ org.xml.sax.ContentHandler のサブクラスを作れば SAX 解析ともっと親和的になると思うけど、そこまでするほどのものでもないですね。
- 作者: エリック・T・レイ,Erik T.Ray,宮下尚,牧野聡,立堀道昭
- 出版社/メーカー: オライリージャパン
- 発売日: 2004/06
- メディア: 単行本
- 購入: 3人 クリック: 62回
- この商品を含むブログ (21件) を見る
- 作者: 株式会社日立システムアンドサービス,XML技術者育成推進委員会
- 出版社/メーカー: 翔泳社
- 発売日: 2008/01/18
- メディア: 単行本(ソフトカバー)
- クリック: 5回
- この商品を含むブログ (2件) を見る