practical RNG schema for JMA XML
気象庁では2011年5月から「気象庁防災情報XML」という形式での情報提供をしています。 利用者に取り扱いやすくするため、というので、 技術的に意味が通るように言い換えるならば、 従来の「かな漢字電文」で様々な情報をShift_JISプレーンテキストに落とし込んで提供していて、利用者側ではアドホックな分析処理を必要としていたのを、 新たにスキーマの明確なXMLを採用することにより改善した、ということなのでしょう。
その意図は、もちろんある程度は達成された一方で、まだまだ利用者側の分析処理の負担軽減のためにできることがあるように思います。 その最たるものが、XMLスキーマを適切に制約し、機械可読に提供し、構造と意味の対応付けを明確化することです。
XMLスキーマはXML要素や属性について、どのような名前のものがどのような順番・包含関係で何個現れうるか(あるいは必ず現れるか)を記述したものです。 XMLデータを読む側にしてみれば、解読結果を格納するデータ構造としてどんなものを用意したらいいのかを、そこで知るわけですね。 そう思ってXSD形式で与えられているスキーマを見ると、(そもそもXSDは読みにくいよねという話はおいて)緩すぎるわけですね。 数十種類の異なる電文の、どれでもパスするような最小公倍数的な構造が与えられているのだけれど、それをすべて待ち受けるデータ構造なんて現実的ではないし、 実際に自分が読みたい種類の場合、いったいどの部分木がもちいられるのか、XSDだけからはまったくわからない。 XSDと別に与えられている辞書ファイルというエクセル表も多少制約されているけど最小公倍数性はかわりません。 結局、データ種別ごとのタグ出現についてはワードで書かれたPDFの解説資料でだけ書かれているわけですね。 スキーマじゃなくて「このタグはこの意味だ」しか書いていないことがあって個数もわからないことが多いし、 バリデータにかけられるという意味で機械可読ではありません。
だから、データ種別ごとのタグ構造が分かるようなスキーマを作ろうというのが本プロジェクトです。
jmx.rnc が Relax NG Compact Grammar による気象庁防災情報 XML のスキーマです。これを読みやすく整理していくつもりです。 概ね次のような段階で作っていこうと思っています。
- 各情報種別について、サンプル電文が通る限りでその情報種別らしさが現れる最低限の制約を書く(Headline, Body直下くらいまで)
- 各情報種別について、サンプル電文から推測される構造に制約する(制約しすぎになるものと想定)
- 毎日現実の電文を食わせて通るように拡張する
- ドキュメント(説明資料)をよく読みこんで備えるべきものに一通り備えられるよう拡張する
ほんとは説明資料が瞬時に理解できてスキーマを書きだせるべきなのですが、 実際には機械可読でもないし、僕が読んでもすぐにはスキーマを書きだせるか心もとない (きっと僕の頭が悪いのです。そういうことにしておいてください)ので、 現実的に最速に価値が出せるのがこうかなというわけです。
なぜ Relax NG を使うかというと、なんといっても Compact Grammar が読みやすいからですが、 もうひとつ、 /Report/Head/InfoKind の値によってそれ以下に許されるタグの構造が変わるというようなスキーマが書けるからですね。 XSD でもできるのかもしれないが、なにせ XSD は読めないのでわからない。
あとは、jmx.rnc にコメントで書き込んでいくべきかな。