💎

Google Hotel APIsのXMLファイルをRubyで作る方法

2022/11/10に公開

イントロダクション


Google Hotel APIsのXMLリファレンス
https://developers.google.com/hotels/hotel-prices/xml-reference/hotel-list-feed?hl=ja

現在、やっている開発で「Google Travel向けの情報をGoogleにXMLファイルで送る」ということをやっているのだが、これに関する記事がGoogleの公式ドキュメントくらいしかなかったので、なかなか苦戦していた。

ーーーー

「そもそも、Rubyでドキュメント通りのXMLを作るには何を使えば良いんだろう、、」

そうした疑問を持った人はこの記事を読んで、さっさと実装できることを願っている。

少しでもGoogle Hotel APIsで苦しむエンジニアが減りますように、、、

作りたいXMLがこちら


以下、Googleに送るべきホテルリストの実際のXML。

<?xml version="1.0" encoding="UTF-8"?>
<listings>
  <language>en</language>
  <listing>
    <id>123abc</id>
    <name>Belgrave House</name>
    <address format="simple">
      <component name="addr1">666 Acacia Ave</component>
      <component name="addr2">Floor 5</component>
      <component name="city">London</component>
      <component name="province">Greater London</component>
      <component name="postal_code">SW1W 9TQ</component>
    </address>
    <country>UK</country>
    <latitude>35.070374</latitude>
    <longitude>-106.213648</longitude>
    <phone type="main">123-456-7890</phone>
    <category>hotel</category> 
  </listing>
</listings>

使うものはこちら


1, nokogiri(Ruby Gems)
2, xmlのインデントを読み解く根気


require 'nokogiri'

↑こんな感じでnokogiriを読み込み、、、

require 'rubygems'
require 'nokogiri'

builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |x|
  ### XML ###
end

puts builder.to_xml

「### XML ###」と書いてある箇所に、実際のXMLの構造を書いていく

XMLを作ろう


早速さっきのXMLをRubyで生成してみる。
コードはこんな感じ。

generate_xml.rb
require 'rubygems'
require 'nokogiri'

builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |x|
  x.listings() {
    x.language "en"
    x.listing() {
      x.id "123abc"
      x.name "Belgrave House"
      x.address(format: "simple") {
        x.component("666 Acacia Ave", name: "addr1")
	x.component("Floor 5", name: "addr2")
	x.component("London", name: "city")
	x.component("Greater London", name: "province")
	x.component("SW1W 9TQ", name: "postal_code")
      }
      x.country "UK"
      x.latitude 35.070374
      x.longitude -106.213648
      x.phone("123-456-7890", type: "main")
      x.category "hotel"
    }
  }
end

puts builder.to_xml

早速実行してみよう

ruby generate_xml.rb

すると、、


<?xml version="1.0" encoding="UTF-8"?>
<listings>
  <language>en</language>
  <listing>
    <id>123abc</id>
    <name>Belgrave House</name>
    <address format="simple">
      <component name="addr1">666 Acacia Ave</component>
      <component name="addr2">Floor 5</component>
      <component name="city">London</component>
      <component name="province">Greater London</component>
      <component name="postal_code">SW1W 9TQ</component>
    </address>
    <country>UK</country>
    <latitude>35.070374</latitude>
    <longitude>-106.213648</longitude>
    <phone type="main">123-456-7890</phone>
    <category>hotel</category>
  </listing>
</listings>


最初にドキュメントで見たホテルリストのXMLと全く同じ構造のものが出来上がった。
この要領でRails内のrakeタスクとして、DBのレコードを引っ張ってきたりして、値を入れていけばいい。

まとめ


このように、nokogiriを使えば、XMLを作ることができる。

少しでもGoogle Hotel APIsで苦しむエンジニアが減りますように、、、

Discussion