zerosp.blog > Web Programming > 2006/09/25 18:09 >

[RubyでECS4.0] Amazonから取得したXMLデータの加工。rexmlを使ってみる

前回の記事から随分と間が開いてしまいました。前回の記事ではAmazonへのリクエスト生成とXMLデータの取得までを書いたので、今回は取得したXMLデータの加工についてです。PerlでXMLを扱うというと、XML::Simple、XML::LibXMLなどがあるんですがRubyだと何だろう?とりあえずRubyのリファレンスマニュアルのサイトを見ると添付ライブラリの中にrexmlというライブラリが紹介されていたのでrexmlを使ってみることにしました。

まず始めに今回利用するAmazonのXMLのデータ形式を見てみます。

<?xml version="1.0" encoding="UTF-8"?>
<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2006-06-28">
  <OperationRequest>
    <HTTPHeaders>
      <Header Name="UserAgent" Value=" UserAgent情報 "/>
    </HTTPHeaders>
    <RequestId> リクエストID</RequestId>
    <Arguments>
      <Argument Name="AssociateTag" Value="xxxxxxx-22"/>
      ~ 以下パラメータ情報 ~
    </Arguments>
    <RequestProcessingTime> リクエストプロセスタイム </RequestProcessingTime>
  </OperationRequest>
  <Items>
    <Request>
      <IsValid>True</IsValid>
      <ItemSearchRequest>
	<ItemPage>1</ItemPage>
	<Keywords>宇多田</Keywords>
	<ResponseGroup>Request</ResponseGroup>
	<ResponseGroup>Small</ResponseGroup>
	<ResponseGroup>Images</ResponseGroup>
	<SearchIndex>Music</SearchIndex>
      </ItemSearchRequest>
    </Request>
    <TotalResults>64</TotalResults>
    <TotalPages>7</TotalPages>
    <Item>
      <ASIN>B000F9UE8E</ASIN>
      <DetailPageURL> 商品へのリンクURL </DetailPageURL>
      <SmallImage>
	<URL> 画像(小)のURL </URL>
	<Height Units="pixels">75</Height>
	<Width Units="pixels">75</Width>
      </SmallImage>
      <MediumImage> 画像(中)の情報 </MediumImage>
      <LargeImage> 画像(大)の情報 </LargeImage>
      <ImageSets> 画像(小~大)の情報。↑といっしょ。 </ImageSets>
      <ItemAttributes>
	<Artist>宇多田ヒカル</Artist>
	<Creator Role="アーティスト">宇多田ヒカル</Creator>
	<Manufacturer>東芝EMI</Manufacturer>
	<ProductGroup>Music</ProductGroup>
	<Title>ULTRA BLUE</Title>
      </ItemAttributes>
    </Item>
    <Item>
      ~ 以下同じ ~
    </Item>
  </Items>
</ItemSearchResponse>

今回はRubyの練習ということで前回も書きましたがAmazonへの取得グループの指定をRequest、Small、Imagesとしているので、ほぼ最小限データとなっていますのでXMLもすっきりとコンパクトです。

rexmlを使ってみる。

まずXMLデータをパースしましょう。ここでは前回の記事で使ったopen-uriライブラリを使ってXMLを読み込みパースしています。

require "rexml/document"

xml_uri = URI.parse(url)
xml = xml_uri.read
doc = REXML::Document.new xml

# ファイルから読みこむ場合はこんな感じ。
xml = File.new( "xml1.xml" )
doc = REXML::Document.new xml

パースしたdocのXMLデータにアクセスするには、REXML::Elements#[]メソッドが使えます。

puts doc.elements["//Item[1]/ItemAttributes/Title"]
#<Title>ULTRA BLUE</Title>

pp = doc.elements["//Item[1]/ItemAttributes/Title"]
puts pp.text
#ULTRA BLUE

puts doc.elements["//Arguments/Argument[@Name='AssociateTag']/@Value"]
#xxxxxxx-22

#の後が出力例になっています。[]内でXPathを使うことができるので結構楽ですね。REXML::Elements#eachメソッドもあるのでイテレータも使うことができます。

doc.elements.each("ItemSearchResponse/Items/Item") { | tmp |

  print tmp.text("ItemAttributes/Title") + "<br />"

}

次はテンプレートエンジンを使って表示回りを考えてみようかな。PerlだとHTML::TemplateやTemplate ToolkitなどがあるんだけどRubyは何があるんだろ。とりあえずまた調べて試してみます。

投稿日 2006-09-25 18:09

当サイトのコメントとトラックバックの扱いについて。

スパム対策のため認証制となっています。受け取ったコメント、トラックバックは一旦保留扱いとなり管理人が許可したものだけ表示されます。

トラックバック

  • [RubyでECS4.0] Amazonから取得したXMLデータの加工。rexmlを使ってみるのトラックバックURL

コメント

コメントフォーム