たのしいXML: RubyでXMLデータを扱う (2)
sample1.rb

2008年05月18日(日)更新

補足: REXML API documentの参照方法を追加しました


■Documentからはじめましょう(sample1.rb)

たけち: さてと、前回でRubyの準備ができたから、今回はとりあえず簡単なXMLデータを読んでみよう。

さらら: はい。。。あっ、あのね。

たけち: なに?

さらら: XMLデータを読む、ってどんな風に読むの?

たけち: あっ、ごめんごめん。Ruby(実際には、REXMLというライブラリ)でDOMとSAXを扱えるんだよ。だから、ここではXMLファイルを読んで、その構造をDOMでたどったり、新しい要素を作ったりしてようってことだよ。

さらら: そうなのね。わかったわ。

たけち: まずは、要素がひとつだけの簡単なXMLデータを作っておこう。


※前回インストールしたRuby 1.8.6には、DOMとSAXをサポートしているREXMLというXMLライブラリが含まれています。

サンプルXMLデータ(1) sample1.xml

<?xml version="1.0" encoding="utf-8" ?>
<sample>サンプル_1です</sample>

さらら: sampleという名前の要素がひとつだけあるのね。

たけち: そうだね。これをDOMの視点で見てみるとつぎのような図になるね。いっしょに、REXMLではどのようにたどってゆくかを描いておくね。

さらら: はい。

sample1.xmlのDOMツリー

  1. Document.root : Documentのルート要素を取得します
  2. Element.name : Elementの名前を取得します
  3. Element.text : ElementのTextを取得します

■Rubyサンプルプログラム(1) sample1.rbのソースコード

さらら: 意外と簡単そうね。

たけち: そう思ってもらえて、よかった。じゃあ、さっそくだけど、次のRubyのソースコードをみて。Rubyのソースコードファイルには、".rb"をつけることを覚えておいてね。

さらら: はい。

Rubyサンプルプログラム(1) sample1.rb
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17

require "rexml/document"
require "kconv"

xml_file_name = "sample1.xml"

doc = nil
File.open(xml_file_name) {|xmlfile|
doc = REXML::Document.new(xmlfile)
}

print("--- ", xml_file_name, "\n")

root_element = doc.root
print("root element name = ", root_element.name, "\n")

root_text = root_element.text
print("root text = ", root_text.tosjis, "\n")

さらら: えっ、これだけなの? Javaのときよりもずっと短いのね。

たけち: そうだね。じゃ、少しずつ見てゆくね。まず、1行目でXMLを処理してくれるREXMLを用意しているね。
      require "rexml/document"
これだけだよ。

さらら: あっ、そうなんだ。これは必ず書いておくのね。

たけち: そうだね。それから2行目は、
      require "kconv"
なんだけど、これはXMLの処理とは関係ないんだけど、コマンドプロンプトウィンドウにREXMLでの処理結果の文字列を表示するために必要なので書いておくね。

さらら: はい。


■XMLファイルのOpen

たけち: で、XMLファイルのOpenは、6〜9行目で行っているよ。8行目の
      doc = REXML::Document.new(xmlfile)
では、OpenしたXMLファイルを元に、REXMLで扱うXMLデータ全体のインスタンスを生成しているんだね。

さらら: ふ〜ん。

たけち: ともかく、このdoc = REXML::Document.new(xmlfile)からXMLデータの処理ができるようになるってことだね。

さらら: あっ、そうなのね。


■最初の子ノード要素(Element)の取得

たけち: 13行目の
      root_element = doc.root
で、Documentの最初の子ノードを取得しているんだ。

さらら: へぇ、ほんとに簡単だわ。


■Elementの名前とTextの取得

たけち: あともなんとなく想像がつくよね。14行目の
      print("root element name = ", root_element.name), "\n"
で、Documentの最初の子ノードの名前を取得して、printでコマンドプロンプトに表示しているよ。で、15 。

さらら: うんうん。じゃあ16行目は、その要素のTextを取得しているのよね、そうでしょ。

たけち: そうだね。

さらら: 17行目は??

たけち: うん。じつは、REXMLの処理ではUnicodeで扱われているんだ。そのために、windowsのコマンドプロンプトに表示するために、
      root_text.tosjis
を使っているんだよ。それには、2行目の指定が必要なんだね。

さらら: あっ、そういうことだったのね。


■サンプルプログラムsample1.rbの実行結果の確認

たけち: じゃ、このsample1.rbを実行した結果をみてみよう。起動は
ruby sample1.rb
と入力するんだよ。

さらら: はい。

サンプルプログラム sample1.rbの実行結果の確認

さらら: 要素名が、"sample"、テキストが"サンプル_1です"って表示されたわ。

たけち: これで大体の雰囲気はつかめたよね。

さらら: えぇ。思ったよりずっと簡単だったわ。これなら私でもできそうな気がするわ。

たけち: おつかれさま。今回はここまでにしておくね。次回から、少しずつ詳しいことを学んでゆこうね。

さらら: は〜い!! (^ ^*

→次回は子要素をたどるです。 (^ ^;



補足: REXML API documentの参照方法

(1) REXML API Doc (zip)のダウンロード

次のサイトから、REXML API Docs (zip) または REXML API Docs (tgz)をダウンロードします。

REXMLのサイト = http://www.germane-software.com/software/rexml/

REXMLのサイト

(2) REXML API Docs (zip)の解凍

ダウンロードしたAPI Docs (zip) または REXML API Docs (tgz)を適当なディレクトリに解凍します。

(3) 解凍したディレクトリの docs/index.htmlを開く

解凍したディレクトリの doc/index.htmlを開きます。

doc/index.htmlを開きます

(4) クラスやメソッドを参照

図に、簡単な参照方法を示します。

クラスやメソッドを参照


[たのしいXML のインデックス]へ