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っていい感じ.