我参与了IE7的开发过程,看到了在IE浏览器中形形色色使用MSXML的方法。显然有一些东西困扰着开发者:MSXML“混乱”的版本以及如何创建“正确”的实例。下面是一段非常常见的代码:
if (Web.Application.get_type() == Web.ApplicationType.InternetExplorer) { var progIDs = [ 'Msxml2.DOMDocument.6.0', 'Msxml2.DOMDocument.5.0', 'Msxml2.DOMDocument.4.0', 'Msxml2.DOMDocument.3.0', 'Msxml2.DOMDocument' ]; // MSXML5.0、MSXML4.0以及Msxml2.DOMDocument都存在问题 for (var i = 0; i < progIDs.length; i++) { try { var xmlDOM = new ActiveXObject(progIDs[i]); return xmlDOM; } catch (ex) { } } return null;}
if (Web.Application.get_type() == Web.ApplicationType.InternetExplorer) {
var progIDs = [ 'Msxml2.DOMDocument.6.0', 'Msxml2.DOMDocument.5.0', 'Msxml2.DOMDocument.4.0', 'Msxml2.DOMDocument.3.0', 'Msxml2.DOMDocument' ];
// MSXML5.0、MSXML4.0以及Msxml2.DOMDocument都存在问题
for (var i = 0; i < progIDs.length; i++) {
try {
var xmlDOM = new ActiveXObject(progIDs[i]);
return xmlDOM;
} catch (ex) {
}
return null;
以上代码遍历progIDs数组并且实例化客户端版本最高的MSXML DOM然后返回给调用者。这段代码暗含:
在这篇文章中我将简要给出MSXML的历史、生命周期以及版本,通过一个例子提供网络中使用MSXML的最佳实践的细节,以及一些需要注意的地方。
如果你想阅读完整的故事,那么请继续阅读下文;否则,请参考下面四个条目以快速掌握梗概:
MSXML生命周期和历史
说来话长,不如让我们回顾不同版本的MSXML、发布背景以及定位。
让我们的客户把他们的应用程序移植到MSXML6上去是我们的最终目标。说到发布,MSXML 6将随着操作系统一起发布,这样网页作者以及软件开发人员都可以方便地使用这个部件而不用考虑发布的问题。不过,由于客户需要在所有微软支持的操作系统上使用同样的XML API,我们仍然需要一种方法使得新的XML技术可以应用到较低版本的操作系统(Win2k、Win XP和Win2k3)中。
MSXML 6已经随着Vista一起发布,不过对于以前的操作系统,则需要单独安装发行包。我们希望MSXML6与较低版本的操作系统的下一个Service Pack一起发布,但是我们需要足够的商业需求才可以这样做。所以,我们的近期和中期计划是仍然保持发布一个可以安装在较低版本操作系统上的MSXML6 可再发行组件包(Redistributable Package)。在以后的博文中,我们会详细讲述迁移到MSXML6的好处。
虽然我们希望今天每个人都在使用MSXML6,但仍然清醒地意识到迁移需要相当的时间。所以我们将继续在MSXML3上投入资源以支持现有的应用程序以及满足那些需要零发布需求。虽然MSXML3并不具有MSXML6的新特性,不过MSXML3仍然不失为一个稳定而强健的XML平台。MSXML3已经随着Win2000 SP4以及以上的操作系统一起发布,对于应用程序而言可以说无需考虑发布的问题。以后,MSXML3的更新将会随着每种操作系统的Service Pack一起发布。 MSXML3 SP7 是最后一个以可再发行组件包形式发布的MSXML3 Service Pack。以后,我们的合作伙伴和客户将不会有使用MSXML3更新的可再发行组件包的需求。
MSXML4是MSXML6的前身,不过并不曾随着操作系统发布。就稳定性、安全性、W3C标准以及与System.Xml的兼容性而言,MSXML6是一个巨大的进步。此外,MSXML6还提供64位版本。目前,我们主要在MSXML6和MSXML3上投入精力,所以我们希望用户尽可能迁移到MSXML6,或者根据需要迁移到MSXML3。
最后,如果不是针对Microsoft Office 2003或者Microsoft Office 2007编写程序却使用MSXML5的开发者,应该尽快迁移到MSXML6。
详述
如何有效地选用一个合适的MSXML的版本呢?从ProgIDs可以看出, MSXML的版本是以并列模式(side-by-side)发布的。这意味着两点:
需要注意的是,对某个特定版本的MSXML来说,Service Pack并不是并列模式安装的,它会升级原来的MSXML到Service Pack的版本。比如,如果你的机器中正在运行MSXML3 SP5,然后你安装了MSXML3 SP7,那么所有使用MSXML3的应用程序将会自动地运行MSXML3 SP7。
理想情况下,用户应该针对MSXML6对应用程序进行标准化。但是正如上文中提到的,在不久的将来,旧版应用程序和需要零部署的应用程序可能会对完全迁移到MSXML6产生阻碍。既然这样,就有两个因素需要平衡:功能和测试代价。于是,本质上我们有两种选择:
一些需要注意的事情
一如往常,如果你有任何的问题、建议或想法,欢迎在这里发表或是直接给我发email。我将会非常乐意看到这些反馈信息。
Adam WienerLead Program ManagerData Programmability/XML Technologies
英文原文
1)在w3c的文档中我们可以看到XMLHttpRequest的send方法是可以不带任何参数的,但事实上包括FireFox在内的一些浏览器必须传入参数,如果不发送任何内容�...