SgmlReader 在 Subtext 中的應用 。
SgmlReader是一款SGML解析器,通過解析html文件,並能有效的把html轉換為格式較規范的XHtml。當然你可能會說用.Net Framework提供的類就可以辦到了,但是總覺得使用起來不太方便(Html格式問題)。
下面就結合Subtext,來說明下它的使用。
在Subtext中,我們注意到有這麼一個函數ConvertHtmlToXHtml() (有2個重載函數),取出其核心內容來分析。代碼如下:
SgmlReader reader = new SgmlReader();
reader.DocType = "Html";
//指明文檔的根元素是Html
reader.WhitespaceHandling = WhitespaceHandling.All;
//指明文檔處理空白的方式
html = RemoveNewLineBeforeCDATA(Html);
//這是調用另外一個函數把CDATA前的換行符去除,不然解析會有問題
reader.InputStream = new StringReader("" + Html + "");
//需要解析的Html內容
reader.CaseFolding = CaseFolding.ToLower;
//指明解析後tag的大小寫
//下面調用Framework提供的類庫
StringWriter writer = new StringWriter();
XmlTextWriter XMLWriter = null;
try
...{
xmlWriter = new XMLTextWriter(writer);
while (reader.Read())
...{
XMLWriter.WriteNode(reader, true);
}
}
finally
...{
if (XMLWriter != null)
...{
XMLWriter.Close();
}
}
string XML = writer.ToString();
return xml.Substring("".Length, XML.Length - "".Length);
}
附:
RemoveNewLineBeforeCDATA函數
private static string RemoveNewLineBeforeCDATA(string text)
...{
if (!String.IsNullOrEmpty(text))
...{
string regex = @">( )+<![CDATA[";
Regex newLineStripper = new System.Text.RegularExpressions.Regex(regex);
return newLineStripper.Replace(text, "><![CDATA[");
}
return text;
}
測試你的Html代碼:
http://www.eggheadcafe.com/articles/html2xHtml/default.ASPx
參考資料:
SgmlReader 源碼及例子下載:
http://www.gotdotnet.com/Community/UserSamples/Details.ASPx?SampleGuid=B90FDDCE-E60D-43F8-A5C4-C3BD760564BC
SgmlReader Api 手冊:
http://www.telerik.com/help/radeditor/5.5/RadEditor~Telerik.WebControls.RadEditorUtils.SgmlReader_members.Html