たのしいXML: RubyでXMLデータを扱う (5) 特定の属性を見る
sample4.rb

2007年09月16日(日)更新


■特定の属性を見る(sample4.rb)

たけち: 前回は要素の属性を見たね。

さらら: ええ。attributes.each を使ったわ。

たけち: それは要素に記述されているすべての属性を見るときに遣うんだけど、今回は、特定の属性を見る方法を学ぼうね。

さらら: ということは、見たい属性を指定するってことね。

たけち: そうだよ。じゃ、まず、そのメソッドを見ておくね。あるElementの属性(Attributes: 属性セット)はElementのattributesメソッドで得られることを前回やったよね。

さらら: えぇ。

たけち: そのAttributesget_attributeメソッドを使うと、パラメタで指定した属性を得ることができるんだよ。その様子を次の図に示しておくね。

特定の属性をみる方法


■get_attributeメソッド

さらら: get_attributeメソッドでは、取得したい属性名をパラメタとして指定するのね。

たけち: そうだね。じゃあ、つぎに今回サンプルとして使うxmlデータを確認しておくね。前回のサンプル(sample3.xml)とほとんど同じだよ。

サンプルXMLデータ(4) sample4.xml

<?xml version="1.0" encoding="utf-8" ?>
<manyo>
  <poem no="0028" poet="持統天皇">春過ぎて夏来るらし白たえの衣干したり天の香具山</poem>
  <poem no="1616" poet="笠郎女">朝ごとに我が見る宿のなでしこの花にも君はありこせぬかも</poem>
  <poem no="2882">朝ごとに我が見る宿のなでしこの花にも君はありこせぬかも</poem>
  <pome no="4516" poet="大伴家持">新しき年の初めの初春の今日降る雪のいやしけ吉事</poem>
</manyo>

さらら: あら、poet(歌人)の属性の記述がない歌が追加されているわ。

たけち: get_attributeメソッドの戻り値が、nil(なにも無い)になるので、それの確認をするために追加したんだよ。

さらら: そうなんだ。


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

たけち: じゃあ、さっそくだけど、次のRubyのソースコードをみて。

さらら: はい。

Rubyサンプルプログラム(4) sample4.rb
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

require "rexml/document"
require "kconv"

xml_file_name = "sample3.xml"

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

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

sample = doc.root
sample.elements.each { |poem|
    print(poem.attributes.get_attribute("no").value, " 番歌 ")

    attr_poet = poem.attributes.get_attribute("poet")
    if attr_poet == nil then
        print(" 歌人: 不明\n")
    else
        print(" 歌人: ", attr_poet.value.tosjis, "\n")
    end

    print(" ", poem.text.tosjis, "\n")

}

さらら: get_attributeメソッドは、15行目と17行目にあるわ。

たけち: そうだね。15行目ではno属性を、そして17行目ではpoet属性を取得しているね。no属性は必ずあると想定しているんだけど、poet属性は無いかもしれないので、18行目で nil かどうかをチェックしているね。

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


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

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

さらら: はい。

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

さらら: "no"属性を使って「〜番歌」、"poet"属性を使って「歌人」がが表示されてるわ。

たけち: そうだね。それに、"poet"属性が無い歌では、「歌人: 不明」となつているよね

さらら: えぇ。そうね。

たけち: よかった。じゃあ、今回はここまでにしておくね。おつかれさま。

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

→次回は入力XMLファイルのエラーチェックです。 (^ ^;


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