これは、monologueに書いている僕のエントリを引っ張ってきて日本語訳してついでに注釈を加えたもの。MSDNのXML開発コーナーを見たら、聞き捨てならないウソが書いてあったので書いてみた。
簡潔に言えば、理論上、RELAX NGをwebサービスで使えないという理由はない。これは、仕様がどうのというより、単に実装が不十分だというだけの問題だ。
Commons.Xml.Relaxng.dllでRelaxngDatatypeProviderを実装して示したように、RELAX NGでも「型付けされた文法」を定義することはできる。そして、いくつかの文法については、その定義内容をランタイム型にマッピングすることだってできるだろう(ただし、すべてのRELAX NG文法についてランタイム型マッピングをサポートすることは、「理論的に」不可能だ。詳しくは後で)。一方で: XML Schemaは(も)、全てがランタイム型にマッピングできるわけではない。xsd.exeで、以下の簡単な例を試してみてほしい1:
(JAXB 1.0 RIがどう処理するかは試していない。2)
つまり事実はこうだ:もし運が良ければ、あなたのスキーマはオブジェクトマッピングに使えるかもしれない。
RELAX NGの方面では、僕たちはまだ型マッピングツールをもっていない。少なくとも、対象となる文法は決定的内容モデルでなければならない。これは、XML SchemaがRELAX NGより複雑になっている原因のひとつだ(XML Schemaは決定的内容モデルを強制するが、RELAX NGはしない)。これを実装するには、川口耕介さんのRelaxMeterのような、非決定的内容モデル検出ユーティリティが必要だ(ただし正確には、RelaxMeterは曖昧性検出ツールだけど)。
いったん決定的内容モデル検出が実装されたら、先のRelaxngDatatypeProviderを使ってオブジェクトマッピングを実装することだってできる。
ただ、注意すべきなのは、フツーの開発者にとって、「どうやったら決定的内容モデルの文法を書くことができるか」っていうのを理解することは、もしかしたらXML Schemaの仕様を理解して盲従するよりも難しいかもしれない、っていうこと(いや実際にはそうでないかもしれない。XML Schemaにはsubstitution-groupsのように、無駄でbuggyなものも含まれているから)。実は僕もRELAX NGの決定的内容モデル検出がどう作用する(べき)ものなのか、理解してはいない。
その他の「新しいXは問題を解決してくれないよ。だってみんな古いYを使っているもの」みたいな議論には関心が無い3。僕らはレガシーなものを捨てることになっても.NET Frameworkが開発を簡単にするって信じた人種なんだからね。