<< Prev Page Next Page >>

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


RubyでXMLをとにかく短いコードで出力したい

前回のXULツールを作ってみるにあたり、出力形式がXMLなので、それをもっと楽にコーディングできないかと思った。

データを出力するのだから、配列とかの繰り返し構文と折り合いのいいものでないといけない。あと、「配列をどーんと与えれば必ずこの決まったXMLに変換されて…」みたいなのもちょっと困る。あくまでも自由なXMLをいかに文字数少なく書き出せるかが勝負。

print '<table id="datatable">'
data.each{|row|
    print "<tr id=\"#{row.id}\">"
    row.each{|cell|
        print "<td>#{cell.value}</td>"
    }
    print "</tr>"
}
print "</table>"
(escapeHTMLとかしてないからよい子は真似しちゃダメだぞ!)

こういうのだと、条件分岐とかなんとか入ったときにわけわかんなく
なるから、もっとスマートにやりたい。せっかくXMLなんだし。


すぐに思いつくのは、こんな感じか。
e = Element.new('table')
e.attr('id', 'datatable')
data.each{|row|
    tr = e.append('tr').attr('id', row.id)
    row.each{|cell|
        tr.append('td').appendText(cell.value)
    }
}
print e.toString
だめじゃん。"append"とか"attr"とか鬱陶しすぎ。素でXML書き出すより増えちゃってる。

そこで参考になるのがjQuery。jQueryは「エレメント作るなら引数にHTMLそのまま受け取っちゃえばいいじゃなーい」というアイディアで
var e = $('<div class="foo"><span id="bar">baz</span></div>')
みたいな書き方をさせる。たしかにそうするならそれが一番短い。

と、いうわけで、こんな風にしてみた。
out = XMLPrinter.new()
out.p('<table>') {|table|
    table.id = 'datatable'
    data.each{|row|
        out.p("<tr id=\"#{row.id}\">") {
             row.each{|cell|
                  out.p("<td>", cell.value)
             }
        }
    }
}
XMLPrinter::p の引数にいろんなものをとれるようにしたのと、ブロックの中で作った要素をさらにいじれて、そしてすべてのブロックの外に出たときに自動でprintすることでコードをきりつめてみた。この単純な例だとあんまり変わらないけど、閉じタグを書かないでいいのと、条件分岐のコードがすごく読みやすくなるので、結構イイ感じじゃないのかなと。


この記事に対するコメント

この記事に対するコメントの投稿



管理者にだけ表示を許可する

この記事に対するトラックバック

トラックバックURL
http://tockri.blog78.fc2.com/tb.php/58-c4aa7c7a
この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。