あけましておめでとうございます。本年もよろしくお願いします。
早速本題。
年始早々取り組んでいる事の依存関係の末端に「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);
}
取りあえず、一つ依存が片付いた…