コンテンツへスキップ
ものがたり
戻る

2004-10-29

今日はたっぷり4:00までは寝ようと思っていたが、2:30頃に電話で起こされてしまう。眠ぃ…

1ヶ月ぶりに日本の本屋で立ち読みとかしていたら、今月のUnix UserにMonoネタが載っているのをハケーン。むしろPortable.NETを取り上げられていたのが興味深い。ネタがWindows Formsだったから、というのはあるけど。日経Byteの方もついにMessageBoxが出たとかいってひと段落した模様。うーん…ご苦労様。

Michael KayのXPath 2.0とXSLT 2.0の本を入手。今更かな?と思いつつ読み始めたけど、やっぱ勉強になることはありそう。これはrecommendationになった時には是非とも邦訳してほしい。recommendation以前にやっちゃうと”A First Look at ADO.NET and System.Xml 2.0”みたいなヒサンなことになっちゃうけど…

あとスティーブン・ピンカーのthe Blank Slateの翻訳の後編も入手。レジで店員に渡そうとして表にひっくり返した時にオビに気づいた:

「なぜ男はレイプするのか」(style=“font-size: 32pt” くらい)

ビミョーにヒいた。

本日の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でいいんじゃないの?」までしか書いてないけど、冷静に考えたらそもそも不要なプロパティだっていう気がしてきた。皆さんどうしたらイイと思います?


この記事を共有:

前の記事
本日のMS.NETのバグ: XmlSchemaComplexType.LocalElements
次の記事