在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。我将会非常乐意看到这些反馈信息。


猜你喜欢
- 首先解释几个概念:TCP:TCP是因特网中的传输层协议,使用三次握手协议建立连接。IP:Internet Protocol协议的英文名直译就
- 最近找遍了python的各个函数发现无法直接生成随机的二维数组,其中包括random()相关的各种方法,都没有得到想要的结果。最后在一篇博客
- 想跟大家聊聊关于 mysql 中的两个小的知识点:redo log 和 binlog 。redo log :InnoDB 存储引擎层方面的日
- 有些时候我们发现一些模块没有提供pip install 命令和安装教程 , 只提供了一个setup.py文件 , 这个时候如何安装呢?步骤打
- 介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。摘要:
- 检测自己当前系统环境中python是否已经安装该module,若未安装请自行安装检测自己的pycharm使用的环境变量是否与当前环境一致若不
- 大家知道,在js里encodeURIComponent 方法是一个比较常用的编码方法,但因工作需要,在asp里需用到此方法,查了好多资料,没
- str()将参数转换为字符串类型a = 26print('我有'+str(a)+'个苹果')输出:我有26个
- 1、引言小 * 丝:鱼哥,鱼哥,help…小鱼:呼吸声越来越弱,你这是劳累过度??小 * 丝:拉倒吧,我这是激动的小鱼:什么大
- 一、常见的匹配规则二、常见的匹配方法1、match()match()方法从字符串的起始位置开始匹配,该方法有两个参数,第一个是正则表达式,第
- 思考一个问题:怎么实现在第一次检索的基础上进行二次检索?通常,我们的做法是第一次检索时保存检索条件,在第二次行检索时组合两次检索条件对数据库
- 介绍我们可以通过for循环来迭代list、tuple、dict、set、字符串,dict比较特殊dict的存储不是连续的,所以迭代(遍历)出
- 实现简单的多线程下载,需要关注如下几点:1.文件的大小:可以从reponse header中提取,如“Content-Length:911”
- 引言最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便。乘着余热未过,头脑清醒
- 各种坑用py2exe,不支持,仅支持2.x用cx_frezee,各种问题方法 用pyinstaller。安装时务必用pip3 install
- 本文实例为大家分享了JavaScript实现简易轮播图的具体代码,供大家参考,具体内容如下完整代码:<!DOCTYPE html>
- 与其他的大型数据库例如 Oracle、DB2、SQL Server等相比,MySQL 自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。
- 芬兰数学家因卡拉花费3个月时间设计出的世界上迄今难度最大的数独。数独是 9 横 9 竖共有 81 个格子,同时又分为 9 个九宫格。规则很简
- 最近做项目正好需要坐标的转换各地图API坐标系统比较与转换;WGS84坐标系:即地球坐标系,国际上通用的坐标系。设备一般包含GPS芯片或者北
- 本文实例讲述了Python矩阵常见运算操作。分享给大家供大家参考,具体如下:python的numpy库提供矩阵运算的功能,因此我们在需要矩阵