たのしいXML: RubyでXMLデータを扱う (6) 入力XMLファイルのエラーチェック
sample5.rb

2007年10月07日(日)更新


■入力XMLファイルのエラーチェック(sample5.rb)

たけち: 今回は入力XMLファイルのエラーチェックの仕方をみておこうね。

さらら: あっ、そういえばこれまでは入力するXMLファイルが必ず正しいものとした処理をしていたわね。

たけち: そうだよね。XMLファイルの記述ミスがあったりしたときには、REXML:ParseExceptionというエラーが発生するんだ。今回はそのエラーが起きたときのRubyでの書き方を学んでおこうね。同時に、読み込むXMLファイルをパラメタとして入力できるようにもしたいね。

さらら: それを知っておくとこれからも安心だわね。

たけち: そうだよ。じゃあ、早速だけど、今回はまずRubyスクリプトの例をみてみよう。

さらら: はい。


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

たけち: ここでsample5.rbのソースコードを載せておくね。

さらら: はい。

Rubyサンプルプログラム(5) sample5.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
44
45
46
47
48
49

require "rexml/document"
require "rexml/parseexception"
require "kconv"

# XMLファイル名を入力するファンクション
def getXMLFileName

    fname = ""
    while fname == ""
        printf("XMLファイル名を入力してください: ")
        fname = $stdin.gets.strip
    end

    return fname

end

##### main処理です

# XMLファイル名を取得します

xml_file_name = ARGV[0]

if xml_file_name == nil
    xml_file_name = getXMLFileName
end

printf("--- xmlファイル名: %s\n", xml_file_name)

# XMLファイルをopenします
doc = nil

begin

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

        printf("---エラーはありませんでした\n")

# パースエラーが発生したとき
    rescue REXML::ParseException=>error
        printf("--- パースエラーです\n")
        printf("to_s=%s", error.to_s())


# ファイルの読み込みエラーなどが発生したとき
    rescue Exception=>error
        printf("--- エラー : %s", error)


end


■処理の概要

さらら: ああら、ちょっと長いわね。それにどこからみていっていいか分からないわ。

たけち: 大きくは次の二つのことをやっているんだ。

  1. 入力XMLファイル名の取得XML
  2. 入力XMLファイル名のパースチェック

で、処理は、
     ##### main処理ですす
     # XMLファイル名を取得します
と書かれている行(コメントの行)の次の行、21行目
     xml_file_name = ARGV[0]
から始まっているよ。

さらら: そうなんだ。

たけち: 処理の概要を次の図に載せておくね。

さらら: はい。

入力XMLファイルのエラーチェックをするスクリプトの例


■入力パラメタの取得

たけち: まずは、入力パラメタの取得だよ。

さらら: はい。

たけち: 21行目の
     xml_file_name = ARGV[0]
で起動時のパラメタを取得しているんだ。

さらら: 起動時のパラメタって?

たけち: たとえば
     ruby sample5.rb sample1.xml
のようにsample5.rbを起動するときのsample1.xmlがパラメタということだよ。

さらら: あっ、はい。わかったわ。

たけち: で、もし
     ruby sample5.rb
のようにsample5.rbを起動するときになにもパラメタをしなかったときには、24行目の
     xml_file_name = getXMLFileName
で、6〜16行目のgetXMLFileNameという名前のファンクションを呼んでいるんだよ。

さらら: そうなんだ。でも、そのgetXMLFileNameという名前のファンクションではいったい何をしているの?

たけち: ユーザにXMLファイル名を入力してもらう処理をしているんだ。その様子を次の図に示すね。

たけち: 入力したファイル名をfnameという変数に格納して、呼び元に渡しているんだよ。

さらら: ということは、xml_file_nameに読み込みたいXMLファイル名が入るのね。

たけち: そうだね。

入力パラメタの取得スクリプトの例


■rescueでエラーを捕まえる(入力XMLファイル名のパースチェック)

たけち: XMLファイルの読み込み処理全体は、32-49行目(begin 〜 end)で行っているんだけど、エラーが発生したときの処理は、41-47行目で行っているんだよ。

さらら: コメントには、「 パースエラーが発生したとき」と「ファイルの読み込みエラーなどが発生したとき」の二つがあるけど??

たけち: 少し詳しく図にしておくね。

XMLファイルのパースとエラー処理の例

たけち: それぞれ、rescueという文があるんだけど、それでパースエラーREXML::ParseException、その他のエラーExceptionが発生したときの処理を書いているんだよ。

さらら: へえ〜。じゃあ、エラーが無かったときは、その部分は処理されないのね。

たけち: そうなんだよ。


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

たけち: じゃ、このsample5.rbを実行した結果をみてみよう。正しいファイルは前に使ったsample1.xmlを使ってみよう。で、間違いを含んだXMLファイルとして次のerro_sample.xmlを使ってみよう。

エラーサンプルXMLデータerror.xml

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

さらら: えっ〜と。。。要素の開始タグの名前と終了タグの名前があっていないのでエラーなのね。

たけち: そう、じゃ、サンプルプログラムsample5.rbを使ってsample1.xmlとerror.xmlを読んでみよう。

さらら: はい。

サンプルプログラム sample5.rbで正しいXMLファイルとエラーを含んだXMLファイルのときの例

さらら: sample1.xmlを読んだときは、 「---エラーはありませんでした」 ってメッセージが表示されるだけね。で、error.xmlのときは、たくさんメッセージが出てるわ。

たけち: error.xmlのときは、サンプルプログラムが表示している 「p--- パースエラーです」 というメッセージの後にたくさんのメッセージか表示されているね。これは、43行目の
    printf("to_s=%s", error.to_s())
で表示されているんだよ。

さらら: そうなんだ。これを見ると、図に示しているみたいに、開始タグ名と終了タグ名が一致していないことが分かるわけね。

たけち: そうそう。これで入力XMLファイルのエラーチェックの仕方がだいたいわかったかな。

さらら: えぇ。ありがとう。わかったわ。

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

さらら: は〜い。

 → 次回はXMLファイルを出力するです。 (^ ^;


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