SgmlReaderをXmlReaderとして使ったらバグ踏んだらしい
hrで区切る構造のHTMLを処理しようと思い、せっかくなのでXmlReaderを直接使うことにしました。
ただそのまま流したらひどいことになるのでSgmlReaderを通したわけですが・・・
using(var reader = new SgmlReader{ Href = "http://.../hoge.html" }) { while (reader.ReadToFollowing("font")) { /* ... */ } }
ReadToFollowingをしたところでNullReferenceExceptionが飛んできた。えっ。
ReadInnerXmlすると空文字列が返ってくるので読めてないのかと思いきや、Readではちゃんとhtml要素に移動してくれる。
もしやと思い試したら通ったコードがこちら。
using (var sr = new SgmlReader{ Href = "http://.../hoge.html" }) { var xml = XDocument.Load(sr).ToString(); using (var reader = XmlReader.Create(new StringReader(xml))) while (reader.ReadToFollowing("font")) { /* ... */ } }
一度XDocumentに読ませて、改めてXMLに変換して、それを読み込む。
/人◕ ‿‿ ◕人\<わけがわからないよ
XmlReaderの派生クラスがバグだらけになっているという記事で名前が挙げられていたけど、これのことか・・・