网络编程
位置:首页>> 网络编程>> JavaScript>> 在Internet Explorer中正确使用MSXML(2)

在Internet Explorer中正确使用MSXML(2)

 来源:SQL中国研发中心 发布时间:2009-02-22 18:41:00 

标签:IE7,浏览器,msxml,dom

详述

如何有效地选用一个合适的MSXML的版本呢?从ProgIDs可以看出, MSXML的版本是以并列模式(side-by-side)发布的。这意味着两点:

  • 版本是隔离的
    比如,如果你已经在你的机器上安装了MSXML3(msxml3.dll),然后你又安装了MSXML6(msxml6.dll)。在System32目录中,它将会与MSXML3并存。如果你有任何需要使用MSXML3的应用程序,这次安装将不会对这个应用程序的执行产生任何影响。

  • ProgIDs锁定版本
    如果你的应用程序需要使用MSXML6的新特性,那么你应该通过MSXML6的ProgIDs来实例化MSXML对象:
    var xmlDOM = new ActiveXObject('Msxml2.DOMDocument.3.0') //uses MSXML 3.0
    var xmlDOM = new ActiveXObject('Msxml2.DOMDocument.6.0') //uses MSXML 6.0

需要注意的是,对某个特定版本的MSXML来说,Service Pack并不是并列模式安装的,它会升级原来的MSXML到Service Pack的版本。比如,如果你的机器中正在运行MSXML3 SP5,然后你安装了MSXML3 SP7,那么所有使用MSXML3的应用程序将会自动地运行MSXML3 SP7。

理想情况下,用户应该针对MSXML6对应用程序进行标准化。但是正如上文中提到的,在不久的将来,旧版应用程序和需要零部署的应用程序可能会对完全迁移到MSXML6产生阻碍。既然这样,就有两个因素需要平衡:功能和测试代价。于是,本质上我们有两种选择:

  • 尝试MSXML6并且以MSXML3做为备用
    MSXML6不仅有一些MSXML3没有的功能(比如支持XSD架构),而且提升了稳定性、性能和安全性。所以你的应用程序应该尝试使用MSXML6,如果出现问题也应该能够用MSXML3来替代。如果你不想在你的应用程序发布前出意外的话,请记住要对你的应用程序分别使用MSXML6和MSXML3进行测试。下面是简单的示例:
    if (Web.Application.get_type() == Web.ApplicationType.InternetExplorer) {
      var progIDs = [ 'Msxml2.DOMDocument.6.0', 'Msxml2.DOMDocument.3.0'];
      
      for (var i = 0; i < progIDs.length; i++) {
        try {
          var xmlDOM = new ActiveXObject(progIDs[i]);
          return xmlDOM;
        } catch (ex) {
        }
      }
       
      return null;
    }

  • 针对MSXML3进行标准化并为在将来使用MSXML6做准备
    这么做会在降低测试代价的同时把应用程序的功能局限在MSXML3上。我会试着在以后的博文中写一些关于MSXML3的应用程序如何迁移到MSXML6(或更高的版本)上。

一些需要注意的事情

  • MSXML6中对安全敏感的特性是默认关闭(off-by-default)的
    然而,为了向下兼容和避免一些问题,MSXML3中一些对安全敏感的特性是默认打开(on-by-default)的。请查阅SDK以了解更详细的信息。

  • 使用XSD架构语言
    MSXML3并不支持Xml Schema(XSD 1.0。所以依赖XSD的应用程序应该直接使用MSXML6。MSXML6在XSD的实现上和MSXML4以及MSXML5上有些不同。MSXML6更加符合W3C标准,对.Net2.0中的System.XML更加兼容。所以在有些应用程序升级的时候可能有些工作要做。请查阅SDK以了解更详细的信息。

  • 默认查询语言
    当你使用DOM中的SelectNodes或SelectSingleNode进行查询的时候,在MSXML6中默认的选择语言是XPath,而在MSXML3中则是XSL模式。可以像这样xmlDoc.setProperty("SelectionLanguage", "XPath"); 通过设置DOM的二级属性“选择语言”把MSXML3的查询语言设置成标准XPath 1.0。请查阅SDK以了解更详细的信息。

  • 不指定版本(version-independent)的ProgIDs
    在MSXML中,有关于“不指定版本”的ProgID的问题总是让人产生混淆。不指定版本的ProgID总是绑定到MSXML3(与许多人认为的绑定到系统中最高版本的MSXML不同)。这就意味着无论指定或不指定版本“3.0”,ProgID将返回同一个对象。比如,下面两行代码都会返回一个MSXML3 DOMDocument对象:
    var xmlDOM = new ActiveXObject('Msxml2.DOMDocument.3.0');

    var xmlDOM = new ActiveXObject('Msxml2.DOMDocument');

  • 较老版本的ProgIDs
    远离那些比3.0还低的ProgIDs的版本。在某些特定的操作系统中,仍然会带有MSXML 2.6。然而在最近的MS06-061安全补丁中,这些较古老版本的已经被禁用(kill-bitted)了。

  • MSXML2 vs. Microsoft命名空间
    我见到过许多代码把ActiveX对象Microsoft.XMLHTTP实例化,而不是MSXML2.XMLHTTP.3.0或MSXML2.XMLHTTP.6.0(如果使用6.0)。Microsoft命名空间事实上已经过时了,而且它是用MSXML3实现的,仅仅是为了支持旧版的应用程序。不幸的是,我们对老版本支持使用了一个好听的名字(Microsoft)。但请在实例化对象的时候坚持使用MSXML2命名空间。

一如往常,如果你有任何的问题、建议或想法,欢迎在这里发表或是直接给我发email。我将会非常乐意看到这些反馈信息。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com