ものがたり(旧)

atsushieno.hatenablog.com に続く

RELAX NG, XML SchemaそしてXMLシリアライゼーションの真実

これは、monologueに書いている僕のエントリを引っ張ってきて日本語訳してついでに注釈を加えたもの。MSDNXML開発コーナーを見たら、聞き捨てならないウソが書いてあったので書いてみた。

簡潔に言えば、理論上、RELAX NGwebサービスで使えないという理由はない。これは、仕様がどうのというより、単に実装が不十分だというだけの問題だ。

Commons.Xml.Relaxng.dllでRelaxngDatatypeProviderを実装して示したように、RELAX NGでも「型付けされた文法」を定義することはできる。そして、いくつかの文法については、その定義内容をランタイム型にマッピングすることだってできるだろう(ただし、すべてのRELAX NG文法についてランタイム型マッピングをサポートすることは、「理論的に」不可能だ。詳しくは後で)。一方で: XML Schemaは(も)、全てがランタイム型にマッピングできるわけではない。xsd.exeで、以下の簡単な例を試してみてほしい*1

















(JAXB 1.0 RIがどう処理するかは試していない。*2

つまり事実はこうだ:もし運が良ければ、あなたのスキーマはオブジェクトマッピングに使えるかもしれない。

RELAX NGの方面では、僕たちはまだ型マッピングツールをもっていない。少なくとも、対象となる文法は決定的内容モデルでなければならない。これは、XML SchemaRELAX NGより複雑になっている原因のひとつだ(XML Schemaは決定的内容モデルを強制するが、RELAX NGはしない)。これを実装するには、川口耕介さんのRelaxMeterのような、非決定的内容モデル検出ユーティリティが必要だ(ただし正確には、RelaxMeterは曖昧性検出ツールだけど)。

いったん決定的内容モデル検出が実装されたら、先のRelaxngDatatypeProviderを使ってオブジェクトマッピングを実装することだってできる。

ただ、注意すべきなのは、フツーの開発者にとって、「どうやったら決定的内容モデルの文法を書くことができるか」っていうのを理解することは、もしかしたらXML Schemaの仕様を理解して盲従するよりも難しいかもしれない、っていうこと(いや実際にはそうでないかもしれない。XML Schemaにはsubstitution-groupsのように、無駄でbuggyなものも含まれているから)。実は僕もRELAX NGの決定的内容モデル検出がどう作用する(べき)ものなのか、理解してはいない。

その他の「新しいXは問題を解決してくれないよ。だってみんな古いYを使っているもの」みたいな議論には関心が無い*3。僕らはレガシーなものを捨てることになっても.NET Frameworkが開発を簡単にするって信じた人種なんだからね。

*1:これは、僕が昔xsd2classという実験プロジェクトを作っていて気づいたものだ

*2:僕はJAXB RIがその辺もっと上手くやっている、というような記事をJava Worldで読んだ記憶がある。monologueではあえてここで止めているけど。

*3:というか、こういう言い方は姑息だとしか思っていない。