MSXML XHTML DTDs——使互联网更美好
微软刚刚发布了一个新的Windows升级包以改善MSXML组件解析XHTML时对W3C服务器的访问。Windows Update自动更新服务应该已经向你推送了这个升级包,不过你也可以通过以下网页手动下载适合你的版本:
- https://support.microsoft.com/?kbid=973688(MSXML4 SP2……如果你还没升级到SP3的话!)
- https://support.microsoft.com/?kbid=973685(MSXML4 SP3)
- https://support.microsoft.com/?kbid=973686(适用于WinXP SP2和Win2K3的MSXML6独立安装版本)
- https://support.microsoft.com/?kbid=973687(适用于所有随Windows发布的MSXML3和MSXML6)
这个升级包究竟是干什么的呢?让我们来看看这么一个场景:网页通过AJAX访问远程主机上的XHTML资源,把内容读入XML文档,然后获取部分信息或者把信息追加到当前网页中。很常见的场景,对不对?
问题是,当你通过MSXML读取XHTML的时候,如果没有关闭DTD处理,那么XHTML中的DOCTYPE声明会指引MSXML读取XHTML DTD以便使用 之类的实体。可以想象,当许多人访问那些使用AJAX的热门网站时,会对DTD服务器产生多少的访问量。一旦DTD服务器过载而不再响应服务的时候,便会发生各种各样的问题,比如:网站由于无法访问资源而导致服务中断、W3C承担更多的维护工作、用户由于诡异的脚本错误而无法正常访问网站,等等。
这个升级包就是为了解决这个问题而发布的。升级以后的MSXML组件将那些XHTML DTD保存起来,当需要的时候直接返回保存起来的版本,以避免对W3C服务器的访问。这些被保存起来的XHTML DTD已经稳定发布好多年了,新的实体将会在其他的URL中发布,所以你不必担心DTD的使用会受到影响。
尝试着运行以下脚本:
function pullXHtml() {
var xml = new ActiveXObject("Msxml2.DOMDocument.3.0");
xml.async = false;
xml.loadXML(
"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" +
"<html xmlns='https://www.w3.org/1999/xhtml' xml:lang='en' lang='en'><head><title>simple document</title></head>" +
"<body><p>a simple paragraph</p></body></html>");
if (xml.parseError.errorCode != 0) {
var myErr = xml.parseError;
WScript.Echo("You have error " + myErr.reason);
} else {
WScript.echo("Yay!");
WScript.echo(xml.xml);
}
}
pullXHtml();
如果你没有安装最新的升级包,你或许会遇到如下错误提示:
You have error The server did not understand the request, or the request was invalid.
Error processing resource 'https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'.
不过,如果你安装了最新的升级包,你将会欣喜地发现XML被成功读取并解析。更进一步,如果使用Fiddler监视网络流量,你更会惊喜地发现访问没有产生任何网络流量!
Marcelo Lopez Ruiz