あけましておめでとうございます。本年もよろしくお願いします。
早速本題。
年始早々取り組んでいる事の依存関係の末端に「SgmlReader」があり、そのままではバージョンとか面倒な事もあって、Portable Class Library化してNuGetで公開しました。
NuGet package ID: SgmlReaderPortable
CodePlex project: SgmlReader for Portable Class Library
ええと、VS2012で作ったので、WP7とかXbox360でも行けるとか(勿論、未確認w)、誰得仕様です。
Portable化のため、外部リソースへのHTTP接続とか出来ないので、デリゲートで外部から依存注入出来るようにしています。
超簡単な例:
// Open stream using (var stream = new FileStream("target.html", FileMode.Open, FileAccess.Read, FileShare.Read)) { var tr = new StreamReader(stream, Encoding.UTF8); // Setup SgmlReader var sgmlReader = new SgmlReader(tr) { DocType = "HTML", // Use internal HTML4 DTD (No external access) WhitespaceHandling = true, // Means WhitespaceHandling.All CaseFolding = CaseFolding.ToLower }; // create document var document = new XmlDocument(); document.PreserveWhitespace = true; document.XmlResolver = null; document.Load(sgmlReader); }
外部リソースにアクセス可能にする例:
// Open stream using (var stream = new FileStream("target.sgml", FileMode.Open, FileAccess.Read, FileShare.Read)) { var tr = new StreamReader(stream, Encoding.UTF8); // Define base uri var baseUri = new Uri("http://www.example.com/"); // Setup SgmlReader var sgmlReader = new SgmlReader(tr, baseUri, // Stream opener delegate (Separate physical resource access) uri => new StreamInformation { Stream = WebRequest.Create(uri).GetResponse().GetResponseStream(), DefaultEncoding = Encoding.UTF8 }) { WhitespaceHandling = true, CaseFolding = CaseFolding.ToLower }; // create document var document = new XmlDocument(); document.PreserveWhitespace = true; document.XmlResolver = null; document.Load(sgmlReader); }
取りあえず、一つ依存が片付いた…