2010年8月11日(水曜日)
XmlPreloadedResolverでXHTML1.1を処理する
公開: 2010年8月12日22時30分頃
W3CのDTDを取りに行きすぎるとBANされるという話がありますで紹介したXmlPreloadedResolverクラスですが、.NET Framework4から使えるようになっています。
DTDを取りに行かなくてもXHTMLをWell-formedなXMLとして扱うことはできるのですが、©などの実体参照が解釈できないという問題があります。XmlPreloadedResolverを使えば、無駄な通信をせずに実体参照も扱えるようになるので便利です。
というわけでさっそく試してみました。たとえば以下のようにすると、
XmlDocument doc = new XmlDocument();
doc.XmlResolver = new XmlPreloadedResolver(XmlKnownDtds.Xhtml10);
文書型宣言に http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd などのURLが出現しても、取りに行かずに解釈することができるようになります。これですべて解決……と思いきや、XmlKnownDtds列挙体 (msdn.microsoft.com)にはXHTML1.0とRSS0.91のものしかありません。XmlKnownDtds.All を指定した場合でも、以下のもので全てのようなのです。
- -//W3C//DTD XHTML 1.0 Strict//EN
- http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd
- -//W3C//DTD XHTML 1.0 Transitional//EN
- http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
- -//W3C//DTD XHTML 1.0 Frameset//EN
- http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd
- -//W3C//ENTITIES Latin 1 for XHTML//EN
- http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent
- -//W3C//ENTITIES Symbols for XHTML//EN
- http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent
- -//W3C//ENTITIES Special for XHTML//EN
- http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent
- -//Netscape Communications//DTD RSS 0.91//EN
- http://my.netscape.com/publish/formats/rss-0.91.dtd
何が困るって、XHTML1.1がどこにもないわけですよ。
とはいえ、諦めるのはまだ早いです。XmlPreloadedResolver.Add() を呼ぶと任意のUriとDTDのペアを追加できるようなので、XHTML1.1のDTDをローカルに置いてからこんな感じでやれば簡単に……。
FileInfo dtdFile = new FileInfo("xhtml11.dtd"); Uri dtdPublicUri = new Uri("http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"); XmlPreloadedResolver xpr = new XmlPreloadedResolver(); using(FileStream fs = dtdFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read)){ xpr.Add(dtdPublicUri, fs); }
……と思いきや、実際に使ってみたらこんな例外が。
System.Xml.XmlException: 'http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-inlstyle-1.mod' を解決できません。
そういえば、XHTML1.1の特徴はモジュール化でしたね。
幸い、XHTML1.1にはモジュール化されたDTD群を合体させたxhtml11-flat.dtdがついているので、ローカルのxhtml11-flat.dtdを読ませるようにして解決しました。flat版があって良かったです……。
- 「XmlPreloadedResolverでXHTML1.1を処理する」にコメントを書く
- 前(古い): 2010年8月10日(Tuesday)のえび日記
- 次(新しい): 2010年8月12日(Thursday)のえび日記