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
# => かぼちゃ
# => はくさい
# => にんじん
# => ぎゅうにく
# => ぶたにく

イベント

2017/12/05(火)
Design Thinking Square