ものがたり(旧)

atsushieno.hatenablog.com に続く

本日のMS.NETのバグ: XmlSchemaComplexType.LocalElements

何となく懐かしい響きのタイトルだ。今日のお題は、.NET 2.0で新しく導入されそうな勢いのLocalElementsプロパティ。このプロパティはXmlSchemaObjectTable型の定義になっていて、QNameからXmlSchemaElementの定義を引っ張り出すことが出来る。

このプロパティの問題点は、以下のスキーマで説明できる:






test



";

コレを見ただけで問題点が分かった人、あなたはXML Schemaなんぞに人生を費やすより他にやることがあるはずです。

このcomplexTypeに含まれる2つのパーティクルfoo要素は、微妙に違う定義をもっている。具体的には、後者のxs:elementには、xs:annotationが含まれている。annotationなんて基本的に大した用途は無いが、それでもSchematronと結合して使用したりする場合もあるはずだ。

さて、LocalElementsプロパティはこれら2つの要素定義を保持しているだろうか。当然、できないのである。どちらも同じQNameをもっているのだから。

このAPIのバグを解決する方法は2つ。ひとつはXmlSchemaObjectTableではなくXmlSchemaObjectCollectionを保持する方法。これなら複数のXmlSchemaElementも問題なく保持できる。

でも、そんなプロパティ、誰か使うだろうか? 僕はいらないと思う。実質的に、このプロパティは、XMLエディタなどで使用可能な要素名を列挙するのに使えれば十分だ。だから、XmlQualifiedNameのテーブルを保持している程度でも良いんじゃないか、と思う。

もっとも、本当にそれで問題解決になるかというと、定義が入れ子になったelementやcomplexTypeの場合には解決になっていないわけで…このプロパティ、やっぱいらないんじゃないの? MSにフィードバックしたときは「QNameのdictionaryでいいんじゃないの?」までしか書いてないけど、冷静に考えたらそもそも不要なプロパティだっていう気がしてきた。皆さんどうしたらイイと思います?