hp12c
16 January 2013

Ruby製ドキュメント生成ツール「Yampla」でYAMLファイルからXMLファイルを生成する

前回紹介したRuby製ドキュメント生成ツール「Yampla」を使って、YAMLファイルからXMLファイルを生成する簡単な例を紹介しますね。

対象情報はプログラミング言語にしましょう。まずは以下のサイトから任意に選択した言語についての情報を取得します。

Freebase

任意ディレクトリを用意し、取得した情報をYAMLフォーマットでファイルに記述します。ここでは各言語についてのデザイナdesigner、公開年year、影響を与えた言語influencedを対象にします。要素名と値の関係はハッシュ(key: value)で表現します。1要素に複数の値があり得る場合は値を配列(- value)で表現します。

language.yaml

Lisp:
 designer:
 - John McCarthy
 year: 1958
 influenced:
 - Python
 - Perl
 - Ruby
 - Caml
 - Pike
 - Dylan
 - CLOS
 - Smalltalk
 - Logo
 - Emacs Lisp
C:
 designer:
 - Dennis Ritchie
 year: 1972
 influenced:
 - C++
 - PHP
 - Vala
 - LPC
 - Perl
 - Objective-C
 - C--
 - PCASTL
 - AWK
 - JavaScript
C++:
 designer:
 - Bjarne Stroustrup
 year: 1983
 influenced:
 - D
 - C#
 - Dylan
 - Perl
 - PHP
 - Dao Language
 - Aikido Programming Language
 - LPC
 - Ferite
 - URBI
Perl:
 designer:
 - Larry Wall
 year: 1987
 influenced:
 - Ruby
 - PHP
 - Python
 - JavaScript
 - ECMAScript
 - Windows PowerShell
 - Dao Language
 - Groovy
 - Frink
 - LPC
Erlang:
 designer:
 - Ericsson
 year: 1987
 influenced:
 - Scala
 - Clojure
 - Fan
 - F#
Haskell:
 designer:
 - Simon Peyton Jones
 - Philip Wadler
 - Paul Hudak
 year: 1990
 influenced:
 - Python
 - Scala
 - Mercury
 - Clean programming language
 - Language Integrated Query
 - Generic Java programming language
 - Perl 6
 - Epigram programming language
 - Cayenne programming language
 - F#
Ruby:
 designer:
 - Yukihiro Matsumoto
 year: 1995
 influenced:
 - Mantra
 - Groovy
 - Perl 6
 - Frink
 - Windows PowerShell
 - BeanShell
 - Ferite
 - Judoscript
 - URBI
 - Nu
JavaScript:
 designer:
 - Brendan Eich
 year: 1995
 influenced:
 - mjt
 - ActionScript
 - Aikido Programming Language
 - Objective-J
 - DECLAN Pro
 - Squirrel programming language
 - Script.NET
 - Curl programming language
 - JScript
 - JScript .NET
Scala:
 designer:
 - Martin Odersky
 year: 2001
 influenced:
 - Fortress programming language
 - Fan

次に、XMLテンプレートをindex_template.xmlという名前で用意します。YAMLデータにはitemsという変数でアクセスできます。Liquidの式{% %}または出力{{ }}タグを使ってテンプレートにYAML上の情報を埋め込みます。配列要素を展開するには{% for item in items %}式が使えます。

index_template.xml

<?xml version="1.0" encoding="UTF-8"?>
<language>
 {% for lang in items %}
 <name>{{ lang.id }}</name>
 <designer>
 {% for name in lang.designer %}
 <name>{{ name }}</name>
 {% endfor %}
 </designer>
 <year>{{ lang.year }}</year>
 <influenced>
 {% for lang in lang.influenced %}
 <language>}}</language>
 {% endfor %}
 </influenced>
 {% endfor %}
</language>

次にこれらファイルを生成したディレクトリlangにおいて、次のコマンドを実行します。

lang% yampla

これによりそのサブディレクトリoutindex.xmlファイルが生成されます。

lang% tree
.
├── index_template.xml
├── languages.yaml
└── out
 └── index.xml

以上により、上記YAMLフィアルから以下のようなXMLデータが生成出来ました。

<?xml version="1.0" encoding="UTF-8"?>
<language>
 
 <name>Lisp</name>
 <designer>
 
 <name>John McCarthy</name>
 
 </designer>
 <year>1958</year>
 <influenced>
 
 <language>Python</language>
 
 <language>Perl</language>
 
 <language>Ruby</language>
 
 <language>Caml</language>
 
 <language>Pike</language>
 
 <language>Dylan</language>
 
 <language>CLOS</language>
 
 <language>Smalltalk</language>
 
 <language>Logo</language>
 
 <language>Emacs Lisp</language>
 
 </influenced>
 
 <name>C</name>
 <designer>
 
 <name>Dennis Ritchie</name>
 
 </designer>
 <year>1972</year>
 <influenced>
 
 <language>C++</language>
 
 <language>PHP</language>
 
 <language>Vala</language>
 
 <language>LPC</language>
 
 <language>Perl</language>
 
 <language>Objective-C</language>
 
 <language>C--</language>
 
 <language>PCASTL</language>
 
 <language>AWK</language>
 
 <language>JavaScript</language>
 
 </influenced>
 
 <name>C++</name>
 <designer>
 
 <name>Bjarne Stroustrup</name>
 
 </designer>
 <year>1983</year>
 <influenced>
 
 <language>D</language>
 
 <language>C#</language>
 
 <language>Dylan</language>
 
 <language>Perl</language>
 
 <language>PHP</language>
 
 <language>Dao Language</language>
 
 <language>Aikido Programming Language</language>
 
 <language>LPC</language>
 
 <language>Ferite</language>
 
 <language>URBI</language>
 
 </influenced>
 
 <name>Perl</name>
 <designer>
 
 <name>Larry Wall</name>
 
 </designer>
 <year>1987</year>
 <influenced>
 
 <language>Ruby</language>
 
 <language>PHP</language>
 
 <language>Python</language>
 
 <language>JavaScript</language>
 
 <language>ECMAScript</language>
 
 <language>Windows PowerShell</language>
 
 <language>Dao Language</language>
 
 <language>Groovy</language>
 
 <language>Frink</language>
 
 <language>LPC</language>
 
 </influenced>
 
 <name>Erlang</name>
 <designer>
 
 <name>Ericsson</name>
 
 </designer>
 <year>1987</year>
 <influenced>
 
 <language>Scala</language>
 
 <language>Clojure</language>
 
 <language>Fan</language>
 
 <language>F#</language>
 
 </influenced>
 
 <name>Haskell</name>
 <designer>
 
 <name>Simon Peyton Jones</name>
 
 <name>Philip Wadler</name>
 
 <name>Paul Hudak</name>
 
 </designer>
 <year>1990</year>
 <influenced>
 
 <language>Python</language>
 
 <language>Scala</language>
 
 <language>Mercury</language>
 
 <language>Clean programming language</language>
 
 <language>Language Integrated Query</language>
 
 <language>Generic Java programming language</language>
 
 <language>Perl 6</language>
 
 <language>Epigram programming language</language>
 
 <language>Cayenne programming language</language>
 
 <language>F#</language>
 
 </influenced>
 
 <name>Ruby</name>
 <designer>
 
 <name>Yukihiro Matsumoto</name>
 
 </designer>
 <year>1995</year>
 <influenced>
 
 <language>Mantra</language>
 
 <language>Groovy</language>
 
 <language>Perl 6</language>
 
 <language>Frink</language>
 
 <language>Windows PowerShell</language>
 
 <language>BeanShell</language>
 
 <language>Ferite</language>
 
 <language>Judoscript</language>
 
 <language>URBI</language>
 
 <language>Nu</language>
 
 </influenced>
 
 <name>JavaScript</name>
 <designer>
 
 <name>Brendan Eich</name>
 
 </designer>
 <year>1995</year>
 <influenced>
 
 <language>mjt</language>
 
 <language>ActionScript</language>
 
 <language>Aikido Programming Language</language>
 
 <language>Objective-J</language>
 
 <language>DECLAN Pro</language>
 
 <language>Squirrel programming language</language>
 
 <language>Script.NET</language>
 
 <language>Curl programming language</language>
 
 <language>JScript</language>
 
 <language>JScript .NET</language>
 
 </influenced>
 
 <name>Scala</name>
 <designer>
 
 <name>Martin Odersky</name>
 
 </designer>
 <year>2001</year>
 <influenced>
 
 <language>Fortress programming language</language>
 
 <language>Fan</language>
 
 </influenced>
 
</language>

簡単ですね!

Yampla」を使って、YAMLファイルからXMLファイルを生成する簡単な例を紹介しました。


関連記事: Rubyで商品リストのようなものを作るときあなたはいつもどうしていますか?


XML Hacks ―エキスパートのためのデータ処理テクニック by Michael Fitzgerald, 佐藤 直生, 木下 哲也, and 福竜興業



Please enable JavaScript to view the comments powered by Disqus. blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS


AltStyle によって変換されたページ (->オリジナル) /