ヴァル研究所 Advent Calendar 2017 13日目の記事です。
今日はシェル芸で駅すぱあとWebサービスのレスポンスをパースして、探索結果を見やすく整形する方法を紹介しようと思います。
シェル芸とは(Wikipediaによると)「主にUNIX系オペレーティングシステムにおいて『マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・テキスト処理を CLI端末へのコマンド入力一撃で終わらせること』(USP友の会会長・上田隆一による定義)」というシェルのワンライナー活用法です。今回はこれを応用してみようというわけです。
が、最初に注意
今日ご紹介する手順は、駅すぱあとWebサービスのXMLレスポンスの要素の並び順に大きく依存しており、返却されるレスポンスの追加といった仕様変更により、動作しなくなる可能性がある点にご注意ください。
(あくまでも、「こういうこともできますよ」的な紹介になります)
まずは実行例
説明の前に、実行例を見てもらうのが良いかと思います。WebAPIを利用するにはアクセスキーが必要になります。「駅すぱあとWebサービス」からお申込みいただくことでアクセスキーを取得できます。
アクセスキーを設定して以下のCLIコマンドを実行すると...。
$ export ACCESS_KEY=アクセスキーを入力してください
$ curl -s -XGET "http://api.ekispert.jp/v1/xml/search/course/extreme?key=${ACCESS_KEY}&answerCount=1&searchType=plain&viaList=東京:博多" \
| xmllint --format - \
| egrep -A2 '(<Point|<Line)' \
| egrep '(<Name)' \
| grep -v '<Name>[A-Z]</Name>' \
| grep -v '<Name>[A-Z][A-Z]</Name>' \
| sed \
-e "s/ <Name>/* /g" \
-e "s/ <Name>/| /g" \
-e "s/\">/: /" \
-e "s/<\/Name>//"
東京駅〜博多駅の経路が見やすく整形されて表示されます!
* 東京
| JR京浜東北・根岸線快速
* 浜松町
| 東京モノレール
* 羽田空港第1ビル(東京モノレール・JAL利用)
| 徒歩
* 羽田空港(東京)
| 空路(東京-福岡)
* 福岡空港
| 徒歩
* 福岡空港(鉄道)
| 福岡市地下鉄空港線
* 博多
パース処理の解説
パース処理の解説、といっても行っていることはUNIXコマンドによるテキスト処理をつらつらと並べているだけです。大まかな流れは以下になります。
-
curl
コマンドで駅すぱあとWebサービスのAPIを呼びだし、レスポンスを取得する。 - 取得したXMLレスポンスを
xmllint --format -
で整形(ここでXMLの各要素を1行毎に切り出しているのがポイント) - 必要なXML要素を
egrep
で抜き出す。 -
sed
で不要なタグ文字を除去する。
以下のようにXMLの子要素を取得したい場合は、 egrep -A1
した後に、お目当のタグを指定して grep
します。
$ # 例)例えば以下のような状態のXMLデータ
$ # <Station code="22828">
$ # <Name>東京</Name>
$ ... | grep -A1 '<Station ' | grep '<Name'
<Name>東京</Name>
これどういうときに役に立つの?
シェル芸でレスポンスをパースするというこの方法、WebAPIのデバッグにおいて、特定のXML要素だけ抜き出して確認したり、今回のような経路をパッと表示して確認したり等、地味に役立ちます。
また、お客様からの問い合わせに簡単な実行例を提示する際にも役立ちます(JavaScriptとかでサンプルを書くと、どうしても処理が長くなってしまうため)。
まとめ
シェル芸で駅すぱあとWebサービスのレスポンスをパースする方法とその実行例を示しました。macOSとかだとターミナルを起動すればすぐに試すことができるので、WebAPIのお手軽なデバッグ手法として覚えておいて損はないかと思います。