アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 連載 » 言語別 YAML用ライブラリ徹底解説 » 第1回 YAMLライブラリのしくみ

言語別 YAML用ライブラリ徹底解説

第1回 YAMLライブラリのしくみ

はじめに

YAML(YAML Ain't Markup Language)とは,データを構造化して表現するためのフォーマットです。目的はXMLと似ていますが,インデントを主体とした記法のため,XMLより読みやすく,書きやすく,わかりやすくなっています。

またデータシリアライゼーション(注1)に使えるように設計されているため,任意のデータ構造が表現できるだけの記述力を持っています。これは,基本的に木構造しか記述できないXMLと比べて,YAMLの大きな利点です。YAMLの文法については,WEB+DB PRESS Vol.43「最新[データ交換フォーマット]攻略ガイド JSON/YAML実践入門」の第3章「YAML実践リファレンス」に解説がありますので,併せて参照してください。

本特集では,YAMLをさまざまなプログラミング言語で利用するためのYAML用ライブラリの使い方を,各言語ごとに紹介していきます。その際,使い方としては,YAML文字列からデータへの変換だけでなく,データをYAML文字列に変換する方法も紹介していきます。これは,「データ交換」の観点で,データをYAML文字列に変換できるとたいへん便利だからです。

注1)
データをバイト列に変換すること。

YAMLライブラリの内部処理について

ここで,YAMLライブラリが行う内部処理の流れについて説明します。これを知っておくと,各ライブラリの理解が容易になります。YAMLライブラリが行う処理は,いくつかのステージに分かれています(図1)(注2)。

図1 YAMLライブラリが行う処理の流れ

図1 YAMLライブラリが行う処理の流れ

parse
YAML文字列を構文解析し,イベントの列に変換します。たとえば「{10, 20}」というYAML文字列は,「StartSequence, ScalarData, ScalarData, EndSequence」というイベントの列に変換されます。
compose
イベントの列をノードに変換します(注3)。ノードは3種類あり,シーケンス,マッピング,スカラーを表します。
construct
ノードをデータに変換します。たとえばスカラーを表すノードは文字列や数値に変換されます。
represent
constructの逆で,データをノードに変換します。
serialize
composeの逆で,ノードをイベントの列に変換します。
present(emit)(注4
parseの逆で,イベントの列を文字列に変換します。

またparse,compose,constructからなる一連の処理を「load」といい,represent,serialize,present(emit)からなる一連の処理を「dump」といいます。

これらの詳細については,YAML仕様書『Chaper 3. Processing YAML Information』を参照してください。

イベントやノードについて調べる方法は,各ライブラリによって違います。リスト1は,Python用のライブラリであるPyYAMLを使ったサンプルスクリプトです。またリスト2はその実行例です。これを使うと,どんなイベントやノードに変換されるか調べることができます。

リスト1 yaml-internal.py: PyYAMLを使ってイベントやノードを調べる

# -*- coding: utf-8 -*-

## 使い方: python yaml-internal.py [file.yaml]

import sys
import yaml

## ファイルまたは標準入力からYAML文字列を読み込む
filename = len(sys.argv) > 1 and sys.argv[1] or None
input = (filename and open(filename) or sys.stdin).read()
input = input.encode('utf8')  ## 文字コードを変換する

## YAML文字列をイベントの列に変換する
print "===== events ====="
for event in yaml.parse(input):
    print event

## YAML文字列からノードを生成する
print "===== node graph ====="
node = yaml.compose(input)
print node

リスト2 yaml-internal.pyの実行例(見やすいように整形済み)

$ cat example.yaml
- abc
- 123
- {x: 10, y: 20}
$ python yaml-internal.py example.yaml
===== events =====
StreamStartEvent()
DocumentStartEvent()
SequenceStartEvent(anchor=None, tag=None, implicit=True)
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value=u'abc')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value=u'123')
MappingStartEvent(anchor=None, tag=None, implicit=True)
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value=u'x')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value=u'10')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value=u'y')
ScalarEvent(anchor=None, tag=None, implicit=(True, False), value=u'20')
MappingEndEvent()
SequenceEndEvent()
DocumentEndEvent()
StreamEndEvent()
===== node graph =====
SequenceNode(tag=u'tag:yaml.org,2002:seq', value=[
  ScalarNode(tag=u'tag:yaml.org,2002:str', value=u'abc'),
  ScalarNode(tag=u'tag:yaml.org,2002:int', value=u'123'),
  MappingNode(tag=u'tag:yaml.org,2002:map', value=[
    ( ScalarNode(tag=u'tag:yaml.org,2002:str', value=u'x'),
      ScalarNode(tag=u'tag:yaml.org,2002:int', value=u'10')
    ),
    ( ScalarNode(tag=u'tag:yaml.org,2002:str', value=u'y'),
      ScalarNode(tag=u'tag:yaml.org,2002:int', value=u'20')
    )
  ])
])
注2)
すべてのライブラリがこの流れのとおりに処理を行っているわけではありません。
注3)
正確には,ノードからなる有向グラフに変換します。以降でも,単に「ノード」だけで「ノードからなる有向グラフ」を表すことにします。
注4)
YAMLの仕様書では「present」という用語が使われていますが,実際のライブラリではかわりに「emit」という用語が使われています。

著者プロフィール

桑田誠(くわたまこと)

プログラマー。Javaに対するLL,XMLに対するYAMLなど,複雑なことをシンプルにするような技術に興味をもつ。

URLhttp://www.kuwata-lab.com/

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

Ubuntu Weekly Recipe

Ubuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。

C/C++プログラマのためのDTrace入門

よくカーネルのチューニングや解析で活用されるDTraceですが,実はユーザプログラムの開発においても非常に有用です。連載ではC/C++プログラマやテストに関わる方向けにDTraceの使い方を解説します。

Blogopolisから学ぶ計算幾何

計算幾何学は,図形に関するアルゴリズムを研究するコンピュータサイエンスの一分野です。本連載では,ビジュアルブログ検索エンジン「Blogopolis」で採用されている計算幾何のアプローチを例に取り上げながら,計算幾何の初歩を実践的に学習します。

検索エンジンはいかにして動くのか?

本連載では, 今や誰もが利用している検索エンジンの中身を,全体の仕組みやデータ構造,アルゴリズムから分散インデックスまで,最近の研究事例も交えて紹介します。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス