在Internet Explorer中正确使用MSXML(2)
来源:SQL中国研发中心 发布时间:2009-02-22 18:41:00
详述
如何有效地选用一个合适的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。我将会非常乐意看到这些反馈信息。
猜你喜欢
- 一个用asp来处理jmail发信的过程,及使用方法. 发信时,直接调用这个过程就行了,很方便。<% dim
- 1、问题现象:有个网站是通过session验证的,前端时间访问正常,但近期后台session老是失效很快,根本没法操作,我设置timeout
- 代码如下:CREATE FUNCTION [dbo].[udf_DaysInMonth] ( @Date DATETIME )
- 引子编程世界里只存在两种基本元素,一个是数据,一个是代码。编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力。数据天生就是文静的
- 我对这两种连接方式认识不够深,似乎朋友们对此也没有定论。请问哪一种更好呢?DSN是采用数据源的连接方式,其使用方法是: Conn.
- 1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数
- 代码如下: var lishustr = "qwertyuiopasdfghjklmnbvcxz"; var s = l
- blankzheng的blog:http://www.planabc.net/经常有朋友问我,网站要在哪些浏览器上测试?要达到怎样的兼容?我
- 英文原文:The seven rules of Unobtrusive JavaScript原文地址:http://icant.co.uk/
- AJAX应用因为它们的表现力的丰富、更加互动和更加迅速的响应得到了赞扬声;这些优点都是通过使用XMLHttpRequest对象来动态的载入数
- 网页制作中是免不了与表格打交道的。表格是网页制作的基础,在网页布局中起着举足轻重的作用,熟练掌握表格的操作,是你制作网页的辅路石,也是你成为
- 存储过程的优缺点: 存储过程优点: 1.由于应用程序随着时间推移会不断更改,增删功能,T-SQL过程代码会变得更复杂,StoredProce
- 一段时间以来,发现有很多人XHTML都不会用,不光是普通的初学者,有的程序员都不是很清楚该怎么写这个XHTML,我这里呢算是把一些常见的应用
- 调用很简单 Readkid.motion.tween(target,duration, vars)target: 要缓动的DOM对象dura
- 一般用 createProcessingInstruction 方法创建处理指令指定参数为 "xml","ve
- 虽然说表单验证在客户端使用javascript来验证已经可以了,但是我们为了防止访客绕过客户端验证也为了数据安全最好还是在服务器端加上必要的
- 用法: 按住鼠标左键拖拽一个框后释放洗洗睡了<!DOCTYPE html public "-//W3C//DTD XHTML
- 1,exists和in的理解exists:如果子查询中包括某一行,那么就为TRUE in:如果操作数为TRUE等于表达式列表中的一个,那么就
- 之前就见过很多网站在侧边栏上使用<dl />标签对来完成侧边栏栏目的布局,最近在研究DEDECMS的默认模板时,也发现该模板在大
- 在网站开发的时候经常要用chr(),但本人比较懒没时间记那么多。于是到用到的时候就查,这样麻烦。现在将它写出来方便以后用到查,也方便大家!c