[RubyでECS4.0] Amazonから取得したXMLデータの加工。rexmlを使ってみる
前回の記事から随分と日が経ってしまいました。前回はリクエスト生成と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は何があるんだろ。とりあえずまた調べて試してみます。

コメント
コメントの受付は停止中です。