たのしいXML: RubyでXMLデータを扱う (12) 要素をソートしてXMLファイル出力
sample13.rb

2008年03月09日(日)更新


■要素をソート(sample13.rb)

たけち: 前回は、入力したXMLデータの要素をソートして表示してみたね。今回は前回のを少し変更して、ソートした要素をXMLファイルとして出力してみよう。

さらら: あっ、はい。どうやるんだっけ。。。(^ ^;

たけち: 入力XMLファイルの要素をソートできたから、そのソートした要素をを出力用のXMLデータ構造に順に足してゆけばいいんだね。

さらら: そっか。それをこれまでやったようにXMLファイルとして書き出してあげればいいのね。


■読み込むXMLファイル

たけち: 読み込みXMLファイルは前回と同じものを使うね。

  • 読み込みXMLファイル名 = sample12_in.xml

さらら: はい。

読み込みXMLファイル sample12_in.xml

<?xml version="1.0" encoding="utf-8" ?>
<manyo>
<poem no="0028" poet="持統天皇">春過ぎて夏来るらし白たえの衣干したり天の香具山</poem>
<poem no="0161" poet="持統天皇">北山にたなびく雲の青雲の星離り行き月を離れて</poem>
<poem no="0397" poet="笠郎女">奥山の岩本菅を根深めて結びし心忘れかねつも</poem>
<poem no="0408" poet="大伴家持">なでしこがその花にもが朝な朝な手に取り持ちて恋ひぬ日なけむ</poem>
<poem no="0599" poet="笠郎女">朝霧のおほに相見し人故に命死ぬべく恋ひわたるかも</poem>
<poem no="0611" poet="大伴家持">今さらに妹に逢はめやと思へかもここだ我が胸いぶせくあるらむ</poem>
<poem no="1353">石上布留の早稲田を秀でずとも縄だに延へよ守りつつ居らむ</poem>
<poem no="1616" poet="笠郎女">朝ごとに我が見る宿のなでしこの花にも君はありこせぬかも</poem>
<poem no="2540">振分けの髪を短み青草を髪にたくらむ妹をしぞ思ふ</poem>
<poem no="4516" poet="大伴家持">新しき年の初めの初春の今日降る雪のいやしけ吉事</poem>
</manyo>

たけち: じゃ早速、具体的なソースコードの例を見てみよう。


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

Rubyサンプルプログラム(12) sample12.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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

require "rexml/document"

xml_file_name = "sample12_in.xml"
out_file_name = "sample13_out.xml"

# 入力XMLファイルを読み込んでREXML::Documentを生成
doc = nil
File.open(xml_file_name) {|xmlfile|
doc = REXML::Document.new(xmlfile)
}

# 歌人・歌番号をキーにしてpoem要素をHashに追加
# 歌人名の無い歌は追加しない
poems = Hash.new

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

    attr_poet = poem.attributes.get_attribute("poet")
    if attr_poet != nil then
        poet = attr_poet.value
        poems[poet + no] = poem
    end
}
# ソート
sorted = poems.sort

# 出力用のXMLデータを生成
out_doc = REXML::Document.new()
out_doc.add(REXML::XMLDecl.new(version="1.0"))
root_element = REXML::Element.new("manyo")
out_doc.add_element(root_element)

# ソートされたpoem要素を順に追加
sorted.each {|key, poem|
    root_element.add_element(poem)
}


# XMLファイルを書き出し
File.open(out_file_name,"w") do |outfile|
    out_doc.write(outfile, 0)
end


※ここでは、文字コードをutf-8としてsample13.rbを作成しています。

さらら: 前回よりさらに長いわね。(^ ^;

たけち: でも、27行目までは前回と同じことをしているよ。今回のサンプルでは、27行目でソートされた"sorted"というHashを使って、29行目以降で出力するXMLデータを生成して、ファイル出力しているよ。

さらら: あっ、そっか。

たけち: 30〜33行目で、出力用のXMLデータのルート要素としてmanyo要素を作っているね。

さらら: はい。

たけち: で、36〜38行目で、ソートされたHashから順にキーと要素(poem)を取り出して、出力用のXMLデータのルート要素 "root_element" に追加()しているね。
root_element.add_element(poem)

さらら: そっか。。。

たけち: そうそう。で、41〜43行目で、出力用のXMLデータをファイルとして書き出しているね。これは今まで何回かのサンプルでもう見てきたから分かるよね。

さらら: えぇ、何度かみているので慣れたわ。


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

たけち: じゃ、このsample13.rbを実行した結果をみてみよう。コマンドプロンプトウィンドウで

  • ruby sample13.rb

と入力してみて。

さらら: はい。。。。。。あっ、sample13_out.xml というファイルができたわ。

たけち: このXMLファイルをブラウザでみてみよう。

sample13.rbの実行結果確認

さらら: 歌人の名前と歌番号の順に、poem要素が並んでいるわ。

たけち: ちゃんと実行できたみたいだね。

さらら: これで、入力したXMLファイルの要素を歌人ごと、歌番号順にソートして出力XMLファイルとして書き出すことができたのね。

たけち: そうだね。じゃ、今回はここまで。

さらら: あっ、はい。ありがとね。

 → 次回はURIを指定してXMLファイルを読む sample14.rbです。(^ ^;


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