XMLとJSONの相互変換を行うライブラリはいくつかありますが、完璧なものはどこにもありません。そもそもフォーマットに互換性がないからです。
XML_Builderを作る中でXMLとJSONを比較したのですが、一旦まとめておこうと思います。
XML
XMLは文書の電子化に源流があります。そのため長いテキストをベースに何か情報を付加していくのには非常に便利なフォーマットです。反面、含めることができるのはテキストのみで、integerやboolean、nullといった基本的な型は存在しませんし、バイナリデータを含めることもできません。(BASE64でエンコードするなどの工夫が必要です)
例えば、以下のような文章があった時、
PHPはPHP: Hypertext Preprocessorの略で、プログラミング言語の一種である。
リンクを張るなど、文章の一部にメタ情報を付与し、
<dfn id="php"><a href="http://jp.php.net/">PHP</a>とはPHP: Hypertext Preprocessorの略</dfn>で、プログラミング言語の一種である。
これをルート要素で囲めば妥当なXMLが出来上がります。
<?xml version="1.0" encoding="UTF-8"?> <p><dfn id="php"><a href="http://jp.php.net/">PHP</a>とはPHP: Hypertext Preprocessorの略</dfn>で、プログラミング言語の一種である。</p>
作っていく流れが自然ですよね。こんな風に、テキスト中の任意の位置にタグを追加できるというのがXMLの大きな特徴です。テキストとタグが入り混じっている部分はmixed contentと呼ばれます。
このmixed contentは他のフォーマットでうまく真似できないものです。XMLをJSONで表現したJSONMLというフォーマットがありますが、これで上記のXMLを真似するとこんな風になります。
["p",["dfn",{"id":"php"},["a",{"href":"http://jp.php.net/"},"PHP"],"とはPHP: Hypertext Preprocessorの略"],"で、プログラミング言語の一種である。"]
健闘はしているんですが、XMLよりも長くなってしまいました。それに、閉じタグが常に"]"なので対応が追い辛いと思います。XMLの閉じタグの仕様は冗長なのですが、人間の目で読むときは読みやすくなります。
また、JSONMLにしてしまうと、(専用ライブラリの補助なしでは)非常に扱い辛いJSONになります。このJSONMLから「http://jp.php.net/」の部分を取り出す場合、「[1][2][1].href」というわけのわからない添え字を書かないといけません。XPathを使えば「//@href[1]」で済むので圧倒的にわかりやすいです。
その他の特徴
- コメント構文がある
- 名前空間
- 周辺実装が充実(XPath, スキーマ言語などなど)
JSON
JSONはJavaScriptのオブジェクト表記法から来ています。そのため何らかのデータ構造体を表す場合は短く表記することができます。当然、テキスト以外にintegerやboolean, nullのような基本型が仕様に含まれており、テキストはバイナリを含めることもできます。
型がしっかり決まっているというのはとても有難いことで、このおかげで「空の値」をそれぞれ区別することができます。null、空文字、空配列、空オブジェクトの区別があるわけです。
{ "a":null, "b":"", "c":[], "d":{} }
この点、XMLはテキストのことしか考えていないので、こういう芸当はできません。
<!-- ... --> <a/> <b/> <c/> <d/> <!-- ... -->
区別がつかなくなってしまいました。XMLで型を表したい場合はXMLSchemaやRELAX NGなど、XML文書とは別にスキーマ定義文書が必要になります。
まとめ
XMLもJSONも得意不得意があるので使い分けすればいいと思うよ!
もう少し言うと、XHTMLなどのXML由来のものを混ぜたければXMLで書いて、そうでなければとりあえずJSONにしとけばたぶん後悔しないと思います。