プログラミング的なSomething

プログラミング的なSomething

ITエンジニア(?)目線で生活・自転車・トレーニング話を綴ります

REXMLでのパース処理アレコレ

あけましておめでとうございます。
有用な記事を少しでも。とか生意気なことを年初は思っていましたが、そもそも「書かなきゃ忘れる!」という自身の性質のためにオープンしたブログですので、雑文気味ですが公開公開。

やること

現在、WebAPIいじってなにがしかを実装したいと考えております。
じゃあXMLなりJSONなりいじれないとね!ということで、まずは文献も多いREXMLを使用した処理を試していることろです。

今回まとめること

XMLファイル(ローカル)を開く手順を実装します。
開いたあとの処理はその場に応じていろいろ実装するはずなので、まずは使う前段階から。

じゃあXML開こう

例によってRubyでスクリプトを組んでいます。以下ソースコード+コメント

XML_sample.rb

require 'rexml/document'
require 'rexml/parseexception'
require 'kconv'

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

  fname = ""
  while fname == ""
    print("Type XML file name :")
    fname = $stdin.gets.stripi
    #fnameが入力されるまで繰り返す
    #$std.getsで入力される文字列を取得する
    #.stripで前後の空白などを取り除く
  end

  return fname
end

#XMLファイル名の取得
xml_file_name = ARGV[0]
#ruby XML_sample.rb hoge.xmlのように、入力されたパラメータを取得する

if xml_file_name == nil
  #入力されたパラメータがない場合、getXMLFileNameメソッドを呼び出す
  xml_file_name = getXMLFileName
end

print("XML File name:#{xml_file_name}\n")
#パラメータを入力して実行した場合に開いたファイル名を表示する


#XMLファイルをOpenする
doc = nil

begin
  File.open(xml_file_name) do |xmlfile|
    doc = REXML::Document.new(xmlfile)
  end

  print("Open!!!!")
  #REXMLでパースが完了!

  #パースエラー発生時
rescue REXML::ParseException=>error
  print("Parse error \n")
  print("to_s=#{error.to_s()}")

  #ファイル読み込みエラー発生時
rescue Exception=>error
  print("error #{error}")
end

エラー処理もしているので、流用できそうな予感。
というわけで、ローカルファイルを実際に指定してテストします。

$ruby XML_sample.rb sample1.xml

正しいXMLファイルなら、こんな感じ

正しくないXMLファイルなら、こんな感じ

ちなみに、正しくないXMLファイルは要素にエラーをもたせてます。
sample1.xml

<?xml version="1.0" encoding="UTF-8"?>
<sample>
 <precure no = "001" name = "tsubomi">blossom</precure>
 <precure no = "002">marine</super_precure>
 <precure no = "003" name = "itsuki">sunshine</precure>
</sample>

以上です。marineがsuperプリキュアになっちゃってます。
要素を取得する実装などは、実際にURIアクセスしたときにまとめてみようかな。