yamlはXMLに代わる構造化されたデータを表現するためのフォーマットです。Ruby on Railsの設定ファイルのデータ形式に採用されたことで注目されています。
今回は、yamlフォーマットのデータにアクセスするためのRuby用ライブラリであるyamlライブラリの使い方について紹介します。
yamlの仕様
構造化されたデータを表現するフォーマットとしてはXMLが有名ですが、読みやすいフォーマットとは言えません。もっと読みやすいフォーマットが提案されています。そして、そのようなXMLに代わる新しいフォーマットの1つがyamlです。
なおyamlはRuby on Railsの設定ファイルに採用されたことで注目されているフォーマットで、読みやすくシンプルにデータを記述できるのが特徴です。Rubyのプログラムでyamlフォーマットのデータを操作する方法を説明する前に、まずはyamlの仕様について紹介します。
yamlとは
yamlとは、XMLに代わる別のマークアップ言語(Yet Another Markup Language)として開発されたフォーマットで、公式には「YAML Ain’t Markup Language」(YAMLはマークアップ言語ではない)の略とされています。
マークアップ言語といえばXMLが有名ですが、人が編集する場合、タグで囲む書き方は編集しやすいフォーマットとはいえません。その点yamlは、シンプルな構造のため人が編集するのもコンピュータが処理するもの容易です。
スペースによるインデントによる表記
yamlのフォーマットは、半角スペースによるインデントによりデータの深さを表現するのが特徴です。そのため階層構造を持つデータをyamlで表現する場合、半角スペースの数でネスト深さを表現します。
例えば、次のような配列をyamlで表現してみましょう。
階層構造を持つ配列の例
["a1", ["b1", "b2", ["c1", "c2"]], "a3"]
先ほどの配列をyamlフォーマットで表現した例
- a1 - - b1 - b2 - - c1 - c2 - a3
Rubyでyamlを利用するには
yamlのフォーマットはテキストのため、yamlを解析するプログラムを自力で作れます。しかし、yamlの仕様を全て盛り込んだプログラムを作るのは面倒です。
Rubyには標準で多くのライブラリを用意されていますが、yamlのデータを扱うライブラリもRubyを標準で用意されているのでRubyの実行環境をインストールすればすぐに使えます。
yamlフォーマットのデータを利用するのなら、Ruby標準のyamlライブラリを利用してください。
Rubyのyamlライブラリを使うには
yamlは、先ほど紹介したように構造化されたデータを表現するフォーマットです。Rubyで扱うなら、yamlを扱うための標準の外部ライブラリであるyamlライブラリを利用します。
次からyamlライブラリの使い方について紹介します。
yamlライブラリをrequireする
今回紹介するyamlライブラリは、Rubyと同時にインストールされるライブラリです。Rubyが使える環境であれば、Rubyのプログラムの冒頭でrequireによりyamlライブラリを取り込むことで、yamlを操作する機能を利用できます。
yamlライブラリをrequireする例
require ‘yaml’
yamlフォーマットのファイルを読み書きする
yamlライブラリを取り込むことで、yamlファイルを読み書きするメソッドなどが使えます。まずはRubyのプログラムからyamlフォーマットのファイルを読み込む方法とファイルに書き出す方法について紹介します。
yamlフォーマットを読み込む
yamlファイルを読み込むには、yamlライブラリのloadメソッドを使います。なおloadメソッドは、引数にファイルオブジェクトを指定し、yamlファイルの内容をハッシュオブジェクトに格納して返すメソッドです。
yamlライブラリのloadメソッドの文法
YAML.load(ファイルオブジェクト)
yamlライブラリのloadメソッドの使用例
require 'yaml' f = open('sample.yml') yml_obj = YAML.load(f)
上記のプログラムで下のyamlファイルをloadメソッドで読み込んだ場合、ハッシュ形式のデータに読み込まれます。
yamlファイルの例
colors: - red - green - blue
yamlファイルを取り込んだハッシュの例
{"colors"=>["red", "green", "blue"]}
yamlファイル名を指定して読み込むには
先ほどファイルオブジェクトを使用するloadメソッドの使い方を紹介しましたが、yamlライブラリにはファイル名を指定してyamlフォーマットのデータを読み込むメソッドも用意されています。それが、load_fileメソッドです。
load_fileメソッドの使い方
YAML.load_file(yamlファイル名)
なおこのメソッドの使い方は、先ほど紹介したloadメソッドのファイルオブジェクトがファイル名に変わるだけです。
yamlライブラリのloadメソッドの使用例
require 'yaml' file_name = "sample.yml" yml_obj = YAML.load(file_name)
yamlフォーマットのデータをファイルに書き出す
yamlライブラリを用いてyaml形式でファイルを書き出す際に使うのがdumpメソッドです。なお、dumpメソッドは、yamlで書き出ししたいハッシュ形式のデータと、ファイルオブジェクトを指定します。
yamlライブラリのdumpメソッドの文法
YAML.dump(ハッシュ形式の書き出しデータ、ファイルオブジェクト)
yamlライブラリのdumpメソッドの使用例
require 'yaml' data = {"colors"=>["red", "green", "blue"]} f = open('sample.yml', "w") YAML.dump(data, f)
yamlファイルへの書き出し例
--- colors: - red - green - blue
なお、yamlライブラリのdumpメソッドでファイルに書き出しすると、1行目に「—」が書き出されます。これはyamlデータ形式の区切り記号なので、先ほどのloadメソッドではハッシュオブジェクトに変換される際に無視されます。
複数のyamlを取り出す方法
先ほど、dumpメソッドでyamlファイルを作成すると、1行目に区切り記号となる「—」が出力されます。yamlデータは、「—」を使うことで複数のドキュメントを格納できます。そして、複数のyamlのドキュメントを処理する際に使われるのがload_documentsメソッドとload_streamメソッドです。
複数のドキュメントを格納したyamlファイルの例
先ほど紹介したようにyamlのフォーマットの「—」は区切り記号です。そしてyamlでは、区切り記号があるとそこまでを1つのドキュメントとして扱い、区切り記号の次から記述されたデータとは別に扱います。
例えば次のyamlデータを見てください。
--- sample: - ex1 - ex2 --- colors: - red - green - blue
このyamlデータには、「—」から次の「—」までの「sample:」から始まるデータと、続く「colors;」から始めるデータの2つのドキュメントが記述されています。今回紹介するload_documentsメソッドとload_streamメソッドは、この2つのドキュメントを別に扱うことが可能です。
ブロックで処理を指定するload_documentsメソッド
複数のyamlフォーマットのドキュメントを読み込み、ブロックに記述した処理を適用するメソッドがload_documentsメソッドです。load_documentsメソッドは、引数にyamlデータを含むファイルオブジェクトを指定し、続くブロックに読み込んだyamlのドキュメントを処理する手順を記述します。
load_documentsメソッドの使い方
YAML.load_documents(ファイルオブジェクト) { yamlドキュメントへの処理 }
yamlライブラリのload_documentsメソッドの使用例
require 'yaml' f = open('samples.yml', "w") YAML.load_documents(f) { |doc} p doc }
この例は、samples.ymlから読み込んだyamlドキュメントをハッシュに格納し、そのハッシュをpメソッドで表示します。
まとめて処理するならload_streamメソッド
load_streamメソッドは、複数のドキュメントを含むyamlフォーマットのファイルを読み込み、それを複数のハッシュを含むオブジェクトに変換するメソッドです。そして、このオブジェクトに格納された複数のハッシュは、eachメソッドなどで取り出せます。
load_streamメソッドの使い方
オブジェクト = load_stream(ファイルオブジェクト)
yamlライブラリのload_streamメソッドの使用例
require 'yaml' f = open('samples.yml', "w") yaml_obj = load_stream(f) yaml_obj.each { |doc} p doc }
まとめ
これまで解説したようにRubyのyamlライブラリを利用することで、新しいデータ格納フォーマットとして注目されているyamlから簡単にデータを取り出すことが可能です。
なおyamlのデータ形式は、以前から使われているXMLに比べて人が読みやすく、また自由度が高いフォーマットです。Ruby on Railsを利用したWebシステムの設定データの保存などに、ぜひ利用してください。