Xmlの操作 読み込み編

item.xml:これを下記コードで読み込みする。

<?xml version="1.0" encoding="utf-8"?>
<inventory title="OmniCorp Store #45x10^3">
  <section name="health">
    <item upc="123456789" stock="12">
      <name>Invisibility Cream</name>
      <price>14.50</price>
      <description>Makes you invisible</description>
    </item>
    <item upc="445322344" stock="18">
      <name>Levitation Salve</name>
      <price>23.99</price>
      <description>Levitate yourself for up to 3 hours per application</description>
    </item>
  </section>
  <section name="food">
    <item upc="485672034" stock="653">
      <name>Blork and Freen Instameal</name>
      <price>4.95</price>
      <description>A tasty meal in a tablet; just add water</description>
    </item>
    <item upc="132957764" stock="44">
      <name>Grob winglets</name>
      <price>3.56</price>
      <description>Tender winglets of Grob. Just add water</description>
    </item>
  </section>
</inventory>
require 'rexml/document'

#引数にはFileオブジェクトかStringオブジェクトを指定する
doc = REXML::Document.new(File.open('item.xml'))

#ノード内の属性値出力
doc.elements.each("inventory/section"){|ele|
	puts ele.attributes["name"] # => health, food
}

#上のコードがどうも気持ち良くなかったので、下記コードの出力で確認したところ
#	REXML::Text
#	REXML::Element
#	REXML::Text
#	REXML::Element
#	REXML::Text
#となる。ElementがTextに挟まれた形式で出力されるらしい
doc.elements["inventory/section"].each{|ele|
	puts ele.class.name
}

#条件付きでノードへアクセス
#ノード値はtextメソッドで取得する
puts doc.elements["/inventory/[@name='health']"].elements["item[@stock='12']/name"].text  # => Invisibility Cream