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アクセスしたときにまとめてみようかな。