ものがたり(旧)

atsushieno.hatenablog.com に続く

XSD Inference (5)type inference

(昨日の書きかけの分も書いておきました。)

今回で最後になるのだけど、僕が書いたXmlSchemaInference.csのコードが1000行ちょいしかない一方で、この一連のテキストの総量は全部で300行近くにもなることに気づくと、とてもじゃないが達成感なんてものはなく、後にはただ徒労感しか残っていなかったりする…

さて、最後はちょっと宿題になっていたデータ型の推測について。と言っても、データ型の推測で難しいことなんてなんにもない(というより、気を付けなきゃいけないことは前回までで書いた)。

MS XSDInferenceでは、データ型の推測は、全てprimitive typeベースでしか行われない。listやunionやrestrictionが推測されることはない(monoでもそう)。

データ型は、最終的にあらゆる型がNGであれば、すべてxs:stringとなる。これは、既存のデータ型について別の文字列値をマージ推測する場合もそうだ。

MS XSDInferenceでは、数値型については、異常なまでに細かく推測が行われる。個人的には、integerとdecimal, doubleだけ推測されれば十分だと思うのだけど、実際にはunsignedByteやbyte、floatまで推測される(負の値がXMLインスタンスに出現しなければ、常にunsignedXXXしか推測されない)。

ちなみに、Microsoft.XSDInferenceでは0,1はxs:booleanとして推測されていたけど、これが数値として推測されなければきわめてまずい*1ことはすぐに分かったのだろう、.NET 2.0のXmlSchemaInferenceでは正しく数値型として推測されることになった。

数値型の他には、xs:boolean, xs:dateTime、xs:durationなども推測されうる。

xs:stringの派生型は推測されない。たとえばいくらインスタンス中に出現する値がxs:tokenとして有効であっても、xs:tokenは推測されない。文字列値の型を細かく分析するのも、あまり実際的ではないだろう。また、xs:anyURIやxs:QNameは推測されない(特に後者はコンテキストに激しく依存するので、とてもではないが不可能だ)。

…以上でXSD Inferenceの設計に関する解説はおしまいだ。XsdInferenceなんてエラい難しそうだ、と思っていた人も、この解説を読み終えた後なら、案外へちょいものだ、と思ってもらえるのではないだろうか。

*1:"true"がxs:booleanとして許容されたかもしれないことを考えれば、0,1以外の数値が出現した時点で数値型に拡張することは出来ないのだから、xs:stringにしなければならない。ということは、"0"が出た後で"2"が出ても、xs:stringにしなければならないのだけど、そんなのは馬鹿げている。