倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

ビルダーの本末転倒な使い方 Reloaded

XML 文書を入力としてこのビルダーでツリー構造を構築させる方法」を Closure 使って実装する件()、冷静に考えれば案外簡単に出来ました。

def xml2builder = new XmlToBuilderReloaded()
xml2builder.parseText(xml)

class XmlToBuilderReloaded{

    final builder = new MarkupBuilder()

    def parseText(String xmlText){
        def parser = new XmlParser()
        def xml = parser.parseText(xmlText)
        buildNode(xml)
    }

    def buildNode(node){
        def secondArg = (node.text()) ? node.text() : createContentClosure(node)
        builder.invokeMethod(node.name(), [node.attributes(), secondArg])
    }

    def createContentClosure(node){
        return {
            for(child in node.children()){
                buildNode(child)
            }
        }
    }
}

ビルダーの invokeMethod() メソッドに渡している secondArg オブジェクトは「テキスト」もしくは「複数の子要素」のどちらかにしています(前回の実装もそうしてました)。

ビルダーに対して invokeMethod() メソッドを呼び出せば良いようですね。 後はビルダーで構築するときにやることを再帰的に行えば良いだけ。 できてみれば何てことなかったですねぇ。

Groovyイン・アクション

Groovyイン・アクション