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