酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

SgmlReader for Silverlight/Windows Phone 7

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に渡したところ上手く動いてくれました。