YAML

最近Rubyを使っていて、設定ファイルに使用するのに適切なフォーマットは何か?ということが気になりだした。Javaであれば、name=valueといった形式のデータを並べたプロパティファイルを作って、java.util.Propertiesにloadするのが最も簡単だが、それ相当の何かが無いだろうか?と思ったわけだ。で、見つけたのがYAMLRuby on Railsがデータベースの設定ファイルのフォーマットとして使っていた。

YAMLは、XMLと同様、構造化したデータを記述できるフォーマットである。俺が知ったのは今日が初めてだが、どうも2001年あたりに産声を上げたようだ。ぜんぜん気づかなかった。

XMLがタグを使っているのに対して、YAMLはインデントと記号を使っている。パッと見た感じ、YAMLフォーマットの方が見やすい。例えば、こういうXMLデータがあるとする。

<for_test_server>
  <user>ideasku</user>
  <passwd>mapiro mahama diromat!</passwd>
  <host>192.160.0.1</host>
</for_test_server>

これをYAMLで書くと、こうだ。

for_test_server:
  user: idesaku
  passwd: mapiro mahama diromat!
  host: 192.168.0.1

で、Rubyには1.8からYAMLパーサが組み込まれており、これを簡単にオブジェクトに落とせる。

#!/bin/env ruby

require 'yaml'
require 'pp'

pp YAML.load(ARGF.read)

で、このスクリプトYAMLフォーマットのファイル(login.yamlとする)を読み込ませると、こうなる。

$parse.rb login.yaml
{"for_test_server"=>
  {"user"=>"idesaku",
   "passwd"=>"mapiro mahama diromat!",
   "host"=>"192.168.0.1"}}
$

コロンで終端させたキーワードは、ハッシュとして扱われる。他にも、ハイフンで箇条書きした場合は配列になる、などなどいろんな表記法がある。詳しい表記方法についてはYAML Cookbook参照。

ここでやってみせたように、ちょっとした設定ファイルであれば、YAMLで書いてしまえばアンマーシャル(デシリアライズ?)する感覚でそのままRubyのオブジェクトとして取り込むことができるので、解析ロジックを書いたりする必要がない。しかも、プロパティファイルと違って構造的に書ける。

同様に構造的なドキュメントを書けるXMLと比べると、おそらくXMLのほうが柔軟で、表現力が高い。しかし、YAMLXMLと比較して圧倒的に簡素でわかりやすい。複雑極まりないXML Schemaと格闘しなくていい。長ったらしい名前のタグをずらずらと並べなくて良いので解析も早く、ドキュメントのサイズも小さくなるだろう。実に人に優しいフォーマットであると言える。

PerlPHPといった他のスクリプト言語にもパーサが出そろっているらしいが、未検証。

参考資料は以下。
IBM XMLの論考: YAMLはXMLに改良を加える
プログラマーのための YAML 入門
Matz日記 XMLとYAML
YAML Cookbook