在网站中需要引入来自外部的HTML,这是很正常的事情。例如允许用户采用HTML直接发表时,或者聚合外部的Feed时,这时候外部的HTML就直接嵌入到我们的代码中。如果我们的网站是设计为符合XHTML的,那就可能因为引入外部HTML而破坏掉XHTML的合法性,甚至连合法的XML都做不到。这时候我们就需要将外部的HTML格式化为合法的XML,以方便我们的处理。
要将HTML转换为XML,最简单的做法就是利用SgmlReader了。
你需要做的仅仅是
1、下载SgmlReader
2、复制下面这段代码
public static string Convert(string html)
{
if (string.IsNullOrEmpty(html.Trim()))
{
return string.Empty;
}
using (SgmlReader reader = new SgmlReader())
{
reader.DocType = "HTML";
reader.InputStream = new StringReader(html);
using (StringWriter stringWriter = new StringWriter())
{
using (XmlTextWriter writer = new XmlTextWriter(stringWriter))
{
reader.WhitespaceHandling = WhitespaceHandling.None;
writer.Formatting = Formatting.Indented;
XmlDocument doc = new XmlDocument();
doc.Load(reader);
if (doc.DocumentElement == null)
{
return string.Empty;
}
else
{
doc.DocumentElement.WriteContentTo(writer);
}
writer.Close();
string xhtml = stringWriter.ToString();
return xhtml;
}
}
}
}
就这么简单。
接着解释一下那段代码,它用到的SgmlReader,一个继承自XmlReader的类,并且在资源中内置了一个HTML.DTD。创建一个SgmlReader的实例,并且指定它使用的DocType是"HTML",那么它就知道这是指它内置的HTML.DTD。当然如果你不喜欢用这个DTD,你可以指定外部的其它DTD给它。接下来所做的事情,就是将它的读取放入一个XmlDocument中,然后再利用一个XmlTextWriter将XmlDocument写出来。如果你需要的结果是一个XmlDocument,那么最后一步就可以省略了。
需要说明的是,SgmlReader所使用的HTML.DTD比我们通常用的loose.dtd还要宽松,所以它仅仅能保持在尽可能兼容输入HTML的情况下,输出合法的XML。如果你需要输出符合XHTML,就需要使用更加严格的DTD,或者对输出的合法XML再作处理。