最近のウェブサービスは、扱うフォーマットはJSONが基本になってきています。XMLしか出力することのできない旧式のウェブサービスはだいぶ滅び、ごく一部になりつつあります。しかし、XMLフォーマットが滅びたわけではないので、何かとXMLを捌くシーンがあります。

しかし、XMLはJSONとは異なり、単純に値を拾う事が難しいです。そのため、JSONで慣れきってると、とてつもなく面倒で嫌になってしまいます。ということで、この面倒なXMLをGoogle Apps Scriptで扱う際のまとめを残しておこうと思います(自分も毎回、処理方法を忘れ、その度に時間を失うので、メモがないと・・・)

今回使用するスプレッドシート

ソースコード

XML Serviceを使って頑張って処理する

Google Apps ScriptにはXML ServiceというXMLを処理する為のクラスが用意されています。ですので、自力でこのクラスを使ってXMLを捌くことは可能です。ただ鬼門なのは普通のXMLタグならば特に問題なくこれで取得できるのですが、コロン(:)が含まれているようなタグについては、名前空間を指定しての処理が必要になります。

書籍検索ですでに処理については記述しています。

  • namespaceを取得する部分(getNamespace)がポイントで、ここでこの処理をしておかないと、コロン(:)で指定されてるタグ内の項目を取得することが出来ません。
  • itemノードのような単純なものでも、getChildrenやらgetAttributeやら・・・ここが最も面倒なポイントです。
  • getChildTextにしてタグ内の項目データを抜き出します。

いくらクラスがあるとはいえ、面倒な点は何も解消していないので、正直結構コードを書いていて面倒だなぁと思います。特に冒頭のnamespaceのURLを指定してきちんと定義する部分が・・・

この処理の結果は以下の配列で取得がされます。

JSONに変換して処理をする

Node.jsの場合、xml2jsonというとても便利なライブラリのおかげで、XMLを簡単にJSON化して処理をする事が可能です。しかし、Google Apps Scriptでは使えません。GithubにはJSONに変換して扱うコードが結構見かけます。JavaScriptサイドで変換するようなこんなコードもありますね。

今回はあくまでもGASサイドなので、こちらのGithubに公開されてる変換コードを使ってみたいと思います。公開されてる関数コードは以下のような感じです。

XMLをJSONに変換してログ出力をしてみました。

ログが途中で切れていましたが、こんな具合に取ることが可能です。これならば、JSONのデータの取得法で簡単にテキストデータを取れますね。Node.jsのxml2jsonのほうがより簡単でしたが。

importxml関数で手っ取り早く処理

GASで色々やるよりも手っ取り早くXMLを処理することの出来る機能が、Googleスプレッドシートには備わっています。それが「importxml関数」。以下の数式を組んで貼り付けるだけで、実はXMLの構造解析と各種データが取得可能です。

2個目の引数ではitemエレメント以下を取得するようにしています。より個別のエレメントを指定すればその値だけが取れる仕組みです。GASで扱うならば、関数で処理させた結果を取得するほうが手っ取り早い上にコードも最小で済みます。ライブラリ等も必要ありません。

図:下手に考えるより手軽に取れちゃう・・・

関連リンク

共有してみる: