RubyでXMLを扱うにはrexmlライブラリを使います。なお、XMLはタグでデータを囲むフォーマットが特徴のテキストファイルで、設定ファイルなどで使われます。
なおXMLはテキストファイルはテキストファイルなので独自の処理を作ることも可能ですが、rexmlライブラリを利用することで簡単にRubyのプログラムでXMLファイルを扱えます。
今回はRubyのrexmlライブラリの使い方について紹介します。
Rubyでxmlを扱うには
Rubyを使えば文字列を解析するプログラムが簡単に作れます。しかし、XMLから目的の要素を取り出す処理を作るのは面倒です。そのような場合、XMLを簡単に扱えるrexmlライブラリを利用してください。
まずはRubyでXMLを扱うためのrexmlライブラリについて紹介します。
Ruby標準のrexmlライブラリ
Rubyは少ない記述で読みやすいプログラムが書けるプログラミング言語ですが、Ruby on RailsにはWebシステム構築に使われる多く機能が用意されており、それを使うことで最小の記述でシステム構築が可能です。さらにRubyGemsなどの外部ライブラリも利用できます。
なお、Rubyの標準システムとして用意されて外部ライブラリもあり、そのようなライブラリはRunyGemsからダウンロードしなくても利用可能です。
そして今回紹介するremxlライブラリもそのような標準の外部ライブラリの1つです。さらにremxmlライブラリには多くのサブライブラリが用意されているので、利用したい機能を選んで利用してください。
remxlライブラリを使う方法
remxlは標準で用意されている外部ライブラリなので、Rubyが使える環境であれば、remxlライブラリも利用できます。
なお、remxlライブラリには幾つかのサブライブラリが含まれており、利用したい機能に合わせてそのサブライブラリを利用します。例えば、XMLを読み込んでそのデータをDOMツリーに変換するには、documentサブライブラリを利用します。
remxlライブラリのdocumentサブライブラリを利用する宣言例
require 'rexml/document'
XMLとはどんなデータ?
今回扱うXMLとは、アプリケーションの設定などで採用されることの多い、汎用性の高いデータ形式です。そしてXMLはテキスト形式なので、XMLで書かれたファイルは、メモ帳などのテキストエディタで簡単に編集できます。
次から、今回紹介するRubyのrexmlライブラリが扱うXMLについて解説します。
そもそもXMLとは
XMLとは、Extensible Markup Languageの略で、そのまま日本語に翻訳すると拡張可能なマークアップ言語という意味です。なお、マークアップ言語とは、タグや記号を使ってそのデータが何かを明示しているのが特徴の記述方法です。そしてXMLは、データの意味を示すタグでデータを囲う書き方が特徴です。
なおタグを利用するマークアップ言語として有名なのがWebページを記述するのに使われるHTMLです。そしてXMLはHTMLと同じような書き方ができ、より汎用性が高いフォーマットと言えます。
タグで囲む書き方
XMLは、”で囲まれたタグと”で囲まれたタグでデータを囲みます。
XMLのタグの書き方
<タグ名>データ</タグ名>
XMLのデータを囲むタグは、そのデータが何の情報かを記述することで、変数名とデータのペアを記述できるのが特徴です。
XMLの例
<プログラミング言語> <言語名>Ruby</言語名> <タイプ>スクリプト</タイプ> <リリース形態>オープンソース</リリース形態> <開発者>まつもと ゆきひろ氏</開発者> <バージョン>3.10</バージョン> </プログラミング言語>
XMLが向いている用途
アプリケーションの設定ファイルは、人が読めるテキストファイルで、しかもプログラムが処理しやすいフォーマットでなければなりません。その点XMLは、テキストファイルであり、要素名とそれに対応したデータを自由に記述できます。
そのためXMLは、アプリケーションの設定ファイルに向いているデータ形式です。さらにXMLは、拡張性が高くプログラムの処理にも向いています。今回紹介するRubyのrexmlライブラリを利用してRuby on Railsで開発するシステムなどで、ぜひ利用してください。
rexmlライブラリの使い方
RubyでXMLファイルを扱う場合、先ほど紹介したremxlライブラリを利用することで簡単にXMLに記述されたデータをプログラムの中で活用可能です。次からremxlライブラリを使ったXML操作方法について紹介します。
XMLファイルを読み込み
remxlライブラリを利用してXMLファイルをRubyのプログラムで扱う際、ファイルを読み込んでDOMと呼ばれるツリー状のオブジェクトにします。そしてremxlライブラリでXMLファイルを読み込むための仕組みが、remxlライブラリのDocumentクラスです。
Documentクラスでは、newメソッドを用いてXMLを扱うためのオブジェクトを作成します。またXMLファイルをプログラムで利用するには、まずopenメソッドでXMLファイルを読み込み、それをnewメソッドの引数に指定してください。
XMLのDocumentオブジェクトを生成するnewメソッドの使い方
DOMオブジェクト = REXML::Document.new(open(XMLファイル名))
XMLファイルを読み込む例
require 'rexml/document' filename = "sample.xml" dom = REXML::Document.new(open(filename))
DOMオブジェクトから要素を取り出すには
先ほどのREXML::Document.newで読み込んだDOMから要素を取り出すには、elementsメソッドを利用します。なおelementsメソッドはDOMの子要素を取り出すメソッドで、XMLのタグ名を「/」で区切ることで要素の場所を指定することが可能です。
elementsメソッドの使い方
変数 = DOMオブジェクト.elements(‘/タグ名/タグ名/…)
elementsメソッドの使い方
dom = REXML::Document.new(open("model.xml") model_a = dom.elements['root/a'].text model_b = dom.elements['root/b'].text model_c = dom.elements['root/c'].text
これはXMLファイル「model.xmlからXMLデータをDOMオブジェクトdomに読み込み、elementsメソッドを使ってrootタグの下にあるaタグ、bタグ、タグのデータを、それぞれmodel_a、model_b、model_cに取り込む例です。
複数の要素はeachメソッドで
先ほど紹介したelementsメソッドは、同じタグの要素が複数あった場合、最初の要素のみ返します。もし、全ての要素を取り出す場合は、eachメソッドを組み合わせて全ての要素を取り出してください。
例えば、次のようなXMLを扱う場合、elementsメソッドは最初の「one」のみ表示します。そこでelementsにeachメソッドを組み合わせることで全ての要素を取り出すことが可能です。
同じタグを複数使ったXMLの例
<root> <data>one</data> <data>two</data> <data>three</data> </root>
elementsのみの場合の例
require 'rexml/document' filename = "sample2.xml" dom = REXML::Document.new(open(filename)) puts dom.elements["/root/data"].text # oneのみ表示する
elementsにeachメソッドを組み合わせた例
require 'rexml/document' filename = "sample2.xml" dom = REXML::Document.new(open(filename)) dom.elements.each('/root/data') do |name| puts name.text # one, two, threeを順に表示する end
XMLファイルをハッシュに取り込む
先ほどrexmlライブラリを用いてXMLファイルをDOMオブジェクトとして取り込み、要素の場所を指定して取り出す方法を紹介しました。
Ruby on Railsの機能を利用すれば、ハッシュに変換することが可能です。もしRuby on RailsでXMLを利用するなら、ActiveSupportのXMLをRubyのハッシュに変換するHash.from_xmlメソッドを利用できます。
Hash.from_xmlメソッドは、XMLデータを取り込んだDOMオブジェクト引数に指定すると、ハッシュを返すメソッドです。なお、ActiveSupportをRubygemからダウンロードしておけば、下記の例のようにrequireで取り込むことでRubyのプログラムとして実行することが可能です。
Hash.from_xmlメソッドでXMLをハッシュに変換する例
require 'rexml/document' require 'active_support' require 'active_support/core_ext' filename = "a.xml" dom = REXML::Document.new(open(filename)) hash = Hash.from_xml(dom.to_s)
まとめ
これまで紹介したようにRubyでXMLファイルを扱うなら、rexmlライブラリを利用してください。なおXMLファイルを読み込み、そのデータをDOMオブジェクトにするには、rexmlライブラリに含まれるDocumentクラスのnewメソッドを利用します。
さらにRuby on RailsにはDOMオブジェクトをハッシュに変換する機能があるので、この機能の利用も検討してください。