2020-03-03
台湾マスクオープンデータのAPI化に続く、API化。刻々と変わる世界各国の対日本の動き。 外務省の海外安全情報オープンデータを使ったglobalsafeは、配信されているXMLオープンデータをそのまま使っていましたが、バックナンバーの取得ができず、ちょっと初回の起動が重いのが難点でした。それを今回 Node.js を使って、API化し高速化。サーバーに過去データもストックする形になりました。


globalsafe - 外務省 海外安全情報オープンデータサーチ」(コロナで検索リンク

GETパラメーターで、スペース区切りでAND検索するキーワードでフィルタリングできるJSON-API
https://app.sabae.cc/api/globalsafe.json?key=コロナ&limit=10
ライセンスは CC BY 外務省 海外安全情報オープンデータ, @taisukef
気軽にご活用ください!


海外安全情報オープンデータ」は、VLEDのオープンデータ表彰2019でjig.jp賞として、勝手ながら選出させていただいた。 日本政府、自治体、各民間企業によるオープンデータ化がますます進みますように!

XMLをJSON化する xml2json が、どうもサーバーでうまくいかなかったので、xmldomのDOMParserを使って、簡易コンバーターを実装。

function makeJSON(xml) { let obj = {} if (xml.nodeType == 1) { // element if (xml.attributes.length > 0) { for (var j = 0; j < xml.attributes.length; j++) { const attribute = xml.attributes.item(j) obj[attribute.nodeName] = attribute.nodeValue } } } else if (xml.nodeType == 3) { // text obj = xml.nodeValue } if (xml.hasChildNodes()) { if (xml.childNodes.length == 1 && xml.childNodes.item(0).nodeName == "#text") { return xml.childNodes.item(0).data } for (let i = 0; i < xml.childNodes.length; i++) { const item = xml.childNodes.item(i) const nodeName = item.nodeName if (nodeName == undefined) { } else if (typeof(obj[nodeName]) == "undefined") { if (!(nodeName == "#text" && item.data == '\n')) { obj[nodeName] = makeJSON(item) } } else { if (typeof(obj[nodeName].push) == "undefined") { var old = obj[nodeName] obj[nodeName] = [] obj[nodeName].push(old) } obj[nodeName].push(makeJSON(item)) } } } return obj } const DOMParser = require('xmldom').DOMParser const toJSONfromXMLString = function(s) { const parser = new DOMParser() const xml = parser.parseFromString(s) return makeJSON(xml) }

attributeも中のタグも一緒くたに扱う変換となっています。必要に応じてカスタマイズするなど、どうぞご活用ください。

links
- 外務省 海外安全情報オープンデータ
- 台湾エリア別マスク残数表示アプリ、JSON-API化して低負荷高速化

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS