XPath
いやぁ,XPathって便利なんですね.最近やっと授業で習って,その便利っぷりを実感しています.そのXPathを標準添付の範囲で使えるんだから,便利ですよねー.
商品表を元にしたXMLファイルを読み込んで,商品名を元にその商品の値段を求める,という課題が出て,まぁそれはJavaでやらなきゃふつーにダメー★(だと思う)なんですが,まぁ折角REXMLでXPath使えるんだから,やってみたよ.
読み込ませたXMLファイルはこんなの.
<goodslist> <goods> <name>坊ちゃん</name> <price>1050</price> <duedate>2006-10-15</duedate> </goods> …
require 'rexml/document' doc = REXML::Document.new(File.open(ARGV.shift)) word = ARGV.shift puts "search word: " + word begin puts doc.get_elements("/goodslist/goods[name/text()='#{word}']/price")[0].get_text.to_s + "円です" rescue puts "見つかりませんでした" end
とりあえず探して見つからなかったら例外(といってもNoMethodError)が発生するんでbegin-rescueでかこってます.効率が悪いんで,リファクタリング.
elems = doc.get_elements("/goodslist/goods[name/text()='#{word}']/price") unless elems.empty? puts elems[0].get_text.to_s + "円です" else puts "見つかりませんでした" end
Effective Javaに,「例外の乱用は避けましょう」って書いていたので,避けた.まぁ実行結果は割愛.
うんうん,なんかXPathっていい感じ.