Rubyでxmlファイル読み込みを行う方法:rexml
RubyでXMLファイルを扱う方法について説明します。
Rubyでは組み込みライブラリに、XMLファイルを扱うrexmlライブラリがあり、これを使ってXMLファイルを読み込みます。
rexmlライブラリを使ってXMLファイルを扱う方法
rexmlライブラリは、gemなどでインストールすることなくrequireだけで使えます。正確には、rexmlは名前空間モジュールで、REXMLのサブライブラリであるDocumentを使います。
以下のように、XMLを指定したインスタンスを作成すると、DOMツリーが構築されます。
xml = REXML::Document.new("XML")
ファイルを指定する場合は、以下のようになります。
doc = REXML::Document.new(File.new("ファイル名.xml"))
XMLの要素を取得する
XMLの解析では、XPathによる方法、CSSセレクタによる方法などが一般的に使われていますが、rexmlはXPathによる解析に対応しています。
以下のサンプルコードは、ヒアドキュメントでXMLを記述した変数xmlを引数に指定し、rexmlの新規インスタンスとしてパースし、変数docに入れています。
これでXML文書を解析する準備ができました。
require 'rexml/document'
xml = <<-EOS
<root>
<a name="a1">
<b>かぼちゃ</b>
<b>はくさい</b>
<b>にんじん</b>
<c>きゃべつ</c>
</a>
<a>
<b>ぎゅうにく</b>
<b>ぶたにく</b>
</a>
<a name="a3" price="1000"></a>
</root>
EOS
doc = REXML::Document.new(xml)
次から、rexmlを使った要素の取得について紹介します。
n番目の要素を指定する
2番目の<a>タグの直下、2番目にある<b>要素の内容「ぶたにく」を取得したいとします。
puts doc.elements['root/a[2]/b[2]'].text # => ぶたにく
このように、一般的なXPathによる指定で、簡単に必要な部分を取り出すことができます。
1番目の要素を取得する
次のように添字を付けないと、1番めの要素が対象となります。
puts doc.elements['root/a/b'].text # => かぼちゃ
要素をすべて取得する
<b>要素の内容をすべて取得したいときは、次のように指定します。
doc.elements.each('root/a/b') do |element|
puts element.text
end
# => かぼちゃ
# => はくさい
# => にんじん
# => ぎゅうにく
# => ぶたにく