如果有如下的Xhtml文字,在.Net中用XmlDocument.LoadXml载入的时候,速度很慢。
-
-
<html xmlns="http://www.w3.org/1999/xhtml">
-
<head>
-
<title></title>
-
</head>
-
<body>
-
<p>Hello.</p>
-
</body>
-
</html>
简单解决:不解析外部资源
这个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文件进行重新定向,定向到本地目录。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2009-06-29 必须掌握的命令行(转)