MSXML XHTML DTDs——使互联网更美好

微软刚刚发布了一个新的Windows升级包以改善MSXML组件解析XHTML时对W3C服务器的访问。Windows Update自动更新服务应该已经向你推送了这个升级包,不过你也可以通过以下网页手动下载适合你的版本:

这个升级包究竟是干什么的呢?让我们来看看这么一个场景:网页通过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&nbsp;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