Windows PhoneでHTMLをパースしないといけなくなりました。
HTMLをテキストとして正規表現によるパースをしても良いんだけど、デスクトップアプリではneueccさんの記事を読んでSGMLReaderを使うようになったので、Windows Phoneでも出来ればSGMLReaderを使いたいと思って探していたら、こんなのを見つけました。
neuecc / SgmlReader.SL — Bitbucket
neueccさんは本当にすごい。使い方等については、このGW中にまとめたいです。
追記 2011.5.1.
さっそくSgmlReader for Windows Phone 7を使ってみました。GW中の課題があったので、シコシコとビューアを作っていました。デスクトップ版では問題の無かったパース処理がSgmlReader for WP7では通りませんでした。
A first chance exception of type 'System.MethodAccessException' occurred in SgmlReader.WP7.dll
ちなみにこんなhtml(空白部分もそのまま)です。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
パースすると、SgmlReader.LazyLoadDtd(Uri)メソッドでSystem.IO.Directory.GetCurrentDirectory()を使っている箇所を通る為にSystem.MethodAccessExceptionで落ちてしまいます。
あとでデバッグするとして、とりあえずは回避するようにしました。WebClientから取得したストリームをStreamReaderに突っ込んで、htmlタグが現れるまでsr.readline()メソッドを4回読んでからSgmlReaderに渡したところ上手く動いてくれました。