现象:LoadXml载入Xhtml文件速度很慢

 

如果有如下的Xhtml文字,在.Net中用XmlDocument.LoadXml载入的时候,速度很慢。







Hello.

 

简单解决:不解析外部资源

这个xml文本和一般xml文本的差别是多了一个Doctype说明,指定了一个DTD文件。根据.Net文档中关于XmlDocument.LoadXml的说明,是不会进行DTD或者Schema的验证的,所以并不是验证消耗了时间。对于Load方法也是这样。

不过,这个xml文本比较涉及到了一个外部文本,http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd,所以微软在Load的时候,会首先载入这个文件。也就是说,在载入每一个Xhtml文件的时候,都会到www.w3.org去下载一个文件。

XmlDocument是通过XmlResolver这个属性来设置如何处理外部资源的。简单的把这个属性设置为null(Nothing),就可以彻底不解析任何外部资源。速度也就快了。

不过,这种解决方法不是彻底的解决方法,因为这样,所有的实体(Entities)都不能正确的解释,比如©之类。如果确认输入文本没有Entities,那可以这样简单的解决。

完美解决:将Xhtml试用DTD保存到本地

完美的解决方法是,把Xhtml所要使用到的DTD相关文件都保存到本地目录上,让XmlDocument从本地读取Entities定义信息。和Xhtml相关的DTD文件一共有6个,在Xhtml 1.0标准附录:DTDs中已经列出,列出文件Url如下。

  • XHTML-1.0-Strict: http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd
  • XHTML-1.0-Transitional: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
  • XHTML-1.0-Frameset: http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd
  • Latin-1 characters: http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent
  • Special characters: http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent
  • Symbols: http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent

以上文件需要保存到本地目录中,然后用下面代码建立XhtmlUrlResolver类对Xhtml相关的DTD文件进行重新定向,定向到本地目录。

你可能感兴趣的:(xhtml,xml,.net,schema,html,文档,C#)