読者です 読者をやめる 読者になる 読者になる

その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

XML は人類には早すぎるフォーマットなのでJSON にしましょう

xml json perl maven

僕はXML ファイルについて、

  • 「読みにくい」
  • 「書きにくい (書くのがめんどい)」
  • 「ファイルが無駄に長くなる」
の3拍子がバッチリ揃っている、「人類がマトモに扱うにはちょっと早すぎるフォーマット」だと思っていて、
「コイツ生かしといて意味あんの?」という感じでFF6 のケフカみたいな扱いをしている訳ですが、
まあそれにつけてもXML ファイルを編集するのがつらいです。

特にMaven のpom.xml を書いているとはげそうになります。
このままpom.xml をマトモに書き続けていけば、抜け毛が増えることは確実でしょう。
その暁にはスカルプD のお世話になること請け合いですが、僕はどちらかと言うとアジエンスが好きなので、
このままアジエンスを使っていきたいなァとぼんやり思ったりするわけです。
ただ、抜け毛が増えてもなお頑なにアジエンスを使い続ければ、ゆくゆくははげること必至なので、
「さあどうしようか」と考えた時に思いついたのは「抜け毛自体を減らせば良い」というアプローチで、
それはつまり根本的な問題であるXML ファイルからの解脱に他なりません。

今こそXML ファイルから、「イケてるしヤバい形式、JSON」*1 に乗り換えるべきだと強く強く思った訳であります。

ただそうは言ってもXML ファイルはそこかしこで要求される訳です。Maven 然り、Android 然り。*2
だったら人間はイケてるしヤバい形式JSON を書いて、コンピュータがそのJSON をXML に変換すれば良いじゃん!!
という事でそんな感じのスクリプトを書きました。

幸いなことに、既に同じ事を考えていた *3 ベリークールなハッカーが
https://metacpan.org/release/XML-XML2JSON
というベリーナイスなモジュールをCPAN にアップしてくれていたのでそれを使うことにします。

で、出来たPerl スクリプトがこちらです。
引数としてコマンドラインからJSON ファイルを渡すと、だばぁとXML ファイルに変換されるます。

例えば、
{
    "foo": {
        "bar": {
            "baz": "foobar"
        },
        "hoge": {
            "$t": "fuga"
        },
        "piyo": {
            "hogera": {
                "$t": "もういや"
            }
        }
    }
}
みたいなJSON が書かれているファイルを与えると、
<?xml version="1.0" encoding="UTF-8"?>
<foo>
  <piyo>
    <hogera>もういや</hogera>
  </piyo>
  <bar baz="foobar"/>
  <hoge>fuga</hoge>
</foo>
的なXML に変換されてどぼうと出力されるのであります。

これを使えばめでたくpom ファイルをJSON で書けるようになるんですけど、
いちいちJSON からXML に変換してからmvn コマンドを叩くのが「ダルさここに極まれり!」って感じだったので
チョロッとシェルスクリプトを書きました。本当にチョロッとしか書いていないので、どうかと思います。
ご覧のように、pom.json をpom.xml に変換してからmvn コマンドを走らせているだけです。

.bashrc だとか.bash_profile だとかに
alias mvn='pass/to/shell/script'
とか書いておけば上手いこと動くような気がしないでもないです。




で、肝心のpom.json がどんな感じかというと、こんな感じです。
{
    "project": {
        "moduleVersion": {
            "$t": "1.0"
        },
        "parent": {
            "groupId": {
                "$t": "com.foo.bar"
            },
            "artifactId": {
                "$t": "hoge-fuga"
            },
            "version": {
                "$t": "2.0"
            }
        }
        .
        .
        .
    }
}
XML と比較してみても劇的に読みやすくなったわけでは無いし、
むしろ"$t" とかいう本来必要のないノイズのせいで読みにくくなっているきらいすらあります。
残念過ぎる……!!


結論

Maven じゃなくてGradle を使えば幸せになれるのでは? と思いました。

*1:参考: [http://iketeru-nagashima.com/] ←これくらいイケてるしヤバい

*2:Java 関係ばっかり!

*3:要出典