XmlValidatingReader is now obsolete
.NET Framework2.0β2におけるXMLの読込みに関してXmlValidatingReaderクラスは既にobsolteだった。(一瞬びびったけれど)コンクリートクラスを使用せずにFactoryパターンに移行するだけらしい。
.NET2.0によるDTD検証を行うXmlReaderの生成
//リゾルバの生成(ここではXmlUrlResolverクラスを使用) XmlResolver resolver = new XmlUrlResolver(); //設定オブジェクトの生成 XmlReaderSettings settings = new XmlReaderSettings(); settings.XmlResolver = resolver; settings.ProhibitDtd = false; settings.ValidationType = ValidationType.DTD; //検証時のイベントハンドラも設定オブジェクトのプロパティ settings.ValidationEventHandler += delegate(object sender, ValidationEventArgs e) { Console.WriteLine("Validation Error: {0}", e.Message); }; //XMLReaderの生成 XmlReader reader = XmlReader.Create("http://host/data/hogehoge.xml", settings); 〜
見慣れないプロパティXmlReaderSettings.ProhibitDtdはDTDの脆弱性を突くDoS対策で追加されたらしい。どのように使うんだろう。Prohibitということはtrue(Dafault)でDTDのパースを禁止するってことかな。(※1)
ADO.NETといい.NET2.0はFactoryパターン等のGofデザイパターンをかなり意識的に採用しているみたいですね。少し前まではそういうのにこだわらない(むしろ自分でを作っちゃう)のがMSだとイメージしていたのだけれど最近はそうでもないらしい。
そういやMSDNマガジンの邦訳にこんな記事もありました。
NET Framework で使用されているデザイン パターンを見つける
※1実際に試してみるとこのプロパティをtrueにセットするか何もセットしない場合はリゾルバ経由でDTDを食わせてもXmlException(DTD の使用はこのXMLドキュメントでは禁止されています。)がスローされてXML自体パースできませんでした。DTDをXML文書内に定義しても同様でした。DTDの検証を行う場合はこのコードのように明示的にfalseをセットしなければならないようです。