Hatena::Grouprubyist

雲雀は高く空を舞い RSSフィード

 | 

2007-06-14

YAML ストリーム 19:51  YAML ストリーム - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  YAML ストリーム - 雲雀は高く空を舞い  YAML ストリーム - 雲雀は高く空を舞い のブックマークコメント

Rubyist Magazine - プログラマーのための YAML 入門 (中級編)」より

複数のYAMLドキュメントを含むデータを、YAMLではストリームという。個々のYAMLドキュメントは「---」で区切る。


読み込み

ストリームの読み込みには以下を用いる。引数 input には文字列または IO オブジェクトFile オブジェクトを含む)が指定できる。

## YAML データ (「---」で区切って複数のデータを記述している)
 str = <<END
 ---
 name:   Ruby
 url:    http://www.ruby-lang.org
 ---
 name:   Python
 url:    http://www.python.org
 ---
 name:   PHP
 url:    http://www.php.net
 END
 
 ## YAML ドキュメントをひとつずつ読み込む
 require 'yaml'
 YAML.load_documents(str) do |doc|
   p doc
 end
 
 ## または複数の YAML ドキュメントをまとめて読み込む
 stream = YAML.load_stream(str)    ## stream は YAML::Stream オブジェクト
 stream.documents.each do |doc|
    p doc
 end

実行結果

 {"name"=>"Ruby", "url"=>"http://www.ruby-lang.org"}
 {"name"=>"Python", "url"=>"http://www.python.org"}
 {"name"=>"PHP", "url"=>"http://www.php.net"}

ストリームを使う利点


書き込み

ひとつのファイルに複数の YAML ドキュメントを書き込むには、YAML.dump_stream() または YAML::Stream#emit() を用いる。

 ## 複数のデータ
 hash_list = [
   { "lang"=>"Ruby",   "url"=>"http://www.ruby-lang.org" },
   { "lang"=>"Python", "url"=>"http://www.python.org"    },
   { "lang"=>"PHP",    "url"=>"http://www.php.net"       },
 ]
 
 ## ひとつのファイルに複数の YAML ドキュメントを出力する
 require 'yaml'
 str = YAML.dump_stream(*hash_list)
 print str
 
 ## または YAML::Stream を使って次のようにする
 stream = YAML::Stream.new()
 hash_list.each { |hash| stream.add(hash) }
 str = stream.emit()
 print str

実行結果

 --- 
 url: http://www.ruby-lang.org
 lang: Ruby
 --- 
 url: http://www.python.org
 lang: Python
 --- 
 url: http://www.php.net
 lang: PHP
 |