XML for Microsoft Windows 2000 的新增功能
作者:Charlie Heinemann
更新日期:2000 年 1 月 10 日 发表日期:1999 年 12 月 15 日
随 Microsoft® Windows® 2000 发布的 Microsoft XML 分析程序 (MSXML.DLL) 实际上是一个服务包版本。它包含的新增功能不多,但修正了大量的错误。还可从 Internet Explorer 5.01 的 Web 版本中得到该版本的 MSXML.DLL,因此它也能用于 Windows NT 4.0。不过,与其早期版本相比,此版本的分析程序最突出的改进在于大大提高了可靠性和缩放能力。新版本的分析程序面对大工作负荷具有更出色的性能,并且在多处理器环境中具有更强大的缩放能力,从而更好地满足服务器的要求。
最突出的改进在于大大提高了可靠性和缩放能力。
本文概述了此分析程序的新增功能,并说明了影响其功能的行为上的变化。如需了解其更多的详细内容,请参阅 XML Developer Center(英文)的 XML 参考文档。
Microsoft XML 分析程序的新增功能
本文将详细说明 Microsoft XML 分析程序的以下新增功能:
对属性的数据类型支持
“id”类型的元素
作为元素名称的数据类型
在 XSL 脚本块中创建 COM 对象的例示
对属性的数据类型支持
Internet Explorer 5 版本的 Microsoft XML 分析程序所提供的数据类型支持,已发展为对属性提供简单的数据类型支持(如“int”、“float”和“date”)。如需查看所支持的数据类型的完整列表,请参阅“XML 数据架构”的参考文档。
分析程序内部的扩展的数据类型支持功能,实现了拥有以属性为核心的数据,这种数据仍可被指定数据类型。可以在整个架构的属性节点上声明数据类型,正如在元素节点上声明一样。使用 AttributeType 元素的 dt:type 属性:
<AttributeType name="y" dt:type="int"/>
<ElementType name="x">
<attribute type="y"/>
</ElementType>
“id”类型的元素
现在,元素可以为“id”类型,如下面的代码所示:
<foo xmlns:dt="urn:schemas-microsoft-com:datatypes">
<bar dt:dt="id">fooid</bar>
</foo>
bar 元素具有“id”类型,这说明 bar 元素的文本值可以用于引用 foo 元素。除了将实例上的元素指定为“id”类型之外,架构还可用于将元素指定为“id”类型。
当元素具有“id”类型之后,该元素的父元素即可通过 id 元素的值来引用。例如,如果想把字串“fooid”传递给 nodeFromID 方法,则该方法会返回 foo 元素。
xmldoc.nodeFromID("fooid")
作为元素名称的数据类型
当前,可以在实例上用 dt:dt 属性来声明数据类型,也可以在架构中用 dt:type 属性或 datatype 元素来声明数据类型。对于随 Windows 2000 发布的 Microsoft XML 分析程序,还可以通过元素的名称来指定其类型。
下面的 XML 元素为整数类型,原因在于其名称拥有“urn:schemas-microsoft-com:datatypes”命名空间,并且其局部名称为有效的数据类型 —“int”:
<dt:int>8</dt:int>
这一指定元素类型的新方法,为创建赋有类型的元素提供了便捷的方式。
在 XSL 脚本块中的 COM 对象的例示
在随 Internet Explorer 5 发布的 Microsoft XML 分析程序中,出于安全原因而不允许在 xsl:script 块中存在 COM 对象的例示。对于随 Windows 2000 发布的 Microsoft XML 分析程序,已经改正了这种情况,现在可以在 xsl:script 块中安全地例示 COM 对象了。
Microsoft XML 分析程序行为上的变化
Windows 2000 版本的 Microsoft XML 分析程序的一些行为发生了变化。这些变化是因修正错误和用户的反馈而产生的。下表列出了会导致行为发生意外变化的错误更正。
错误更正
功能领域
错误说明
注释
XSL 模式
对于由实体定义的元素,带有 // 的查询将返回重复的结果。
现在不允许对 DocumentType 节点的内容进行 XSL 模式的导航。
数据类型
即使删除了数据类型声明(即 "dt:dt='int'"),元素仍保留其数据类型。
删除了数据类型声明之后,元素将不再保留其数据类型。
命名空间
允许用保留的命名空间来限定元素。
无论“xml”的大小写字母组合如何,用户都不能将其设置为前缀。它是一个保留的命名空间前缀。
命名空间
无法保持空元素上的命名空间声明。
现在能够保持空元素上的命名空间声明。
数据类型
数据类型有效性判断是在 XSL 变换之前进行的。这会造成下面这样的 XSL 元素发生错误:<price dt:dt="number">
<xsl:value-of select="price"/>
</price>
在 XSL 能够进行变换之前,Microsoft XML 分析程序不再使数据类型生效。
XML 数据源对象
oncellchange 事件会激发两次。
现在,对于数据的每次实例变化,oncellchange 事件只激发一次。
对象模型
元素的第一个子元素的 previousSibling 特性将返回父元素上的 attributes 集合中的最后一个属性(如果 attribute 集合不为空)。
元素的第一个子元素的 previousSibling 特性现在将返回 null(无论父元素上的 attribute 集合是否为空)。
对象模型
复制的文档保留了原始文档的 ID 映射(即,ID 导航会使您回到原始文档)。
复制的文档中的 ID 被映射到该复制的文档内部的节点,而非原始文档中的节点。
对象模型
复制文档中不包含对原始文档的内部子集的复制。
现在复制的文档中包含对原始文档的内部子集的复制(如果存在这样的子集)。
XML DSO
通过设置 documentElement 属性来替换根元素时,不会导致重新构造记录集的形式。
通过设置 documentElement 属性来替换根元素,现在会导致重新构造记录集的形式。
有效性
DTD 中允许存在无效的 XML(作为实体的值)。
不再允许 DTD 中存在无效的 XML(当实体被分解后)。
对象模型
在 Visual Basic® 中没有提供错误信息。
现在 Visual Basic 中提供了错误信息。
对象模型
设置布尔型元素的 nodeTypedValue 特性,会在保持操作后产生无效的 XML。
现在当布尔值被设为真时,将保持“1”值,而非“-1”。“-1”值对于布尔型的节点不是有效的值。
IE4 对象模型
属性值与 Internet Explorer 4.0 不兼容。
现在,属性值中的 \t 和换行被转换为‘ ’(空格)。这与 Internet Explorer 4.0 的实现是兼容的。
分析程序
Microsoft XML 2.0 分析程序不支持“us-ascii”编码。
Microsoft XML 2.0 分析程序现在能够支持“us-ascii”编码。
对象模型
就基于 HTML 的 XML 应用程序而言,未正规化的换行堪称严重问题。
现在回车和换行均转换为换行。
对象模型
使用 loadXML 方法加载 XML 文档,会强制 resolveExternals 为 False。
如果没有安全环境(诸如在 C、C++ 或 HTML 行为中),则 resolveExternals 特性将为 False。如果存在安全环境(如在 HTML 页中),则应将其设为 True。
对象模型
如果 isSuccessful 参数为 NULL,那么 loadXML 方法将返回 S_FALSE。
分析失败时,Microsoft XML 分析程序只返回 S_FALSE。
分析程序
Microsoft XML 2.0 分析程序无法处理用于元素声明中的参数实体,如下例所示:<!ELEMENT document (%inline;)>
现在分析程序能够正确分析元素声明中的参数实体:<!ELEMENT document (%inline;)>
数据类型
对 bin.base64 的实现不正确。Microsoft XML 2.0 分析程序将该字符集中的“/”识别为“*”。
base64 字符集为:
“ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz0123456789+/”。Microsoft XML 分析程序现在能正确识别了。
XSL
XSL 中的脚本能改变 Internet Explorer 中的 DOM,但不会改变其他容器中的 DOM。
现在无论对于何容器,均限制 Microsoft XML 分析程序改变 DOM。
XML DSO
$Text 域的值与映射到该域的节点文本值不同。
现在 $Text 域和节点值域均已正规化。
XSL
XSL 能够显露在架构中定义的数据类型的“dt”属性。
在架构中定义了数据类型后,不会再在 DOM 树中显露其 dt:dt 属性。
分析程序
注册实体声明之下的 ID。
Microsoft XML 分析程序不再注册实体声明之下的 ID。
行为上的其他变化
以下变化是根据用户的反馈而做出的,会导致您的应用程序的行为发生变化:
Microsoft URL 不再区分大小写。
如果两次调用 id(),并引用相同的节点,则起作用的是第二个引用。
当访问 xmlns:foo 和 xml:space 属性的 namespaceURI 特性时,会分别得到“http://www.w3.org/XML/1998/namespace”和“”。现在此变化是一个错误,表现为随 Internet Explorer 5 发布的 Microsoft XML 分析程序会发生异常行为。在将来发布的版本中会修正该错误。
在工作负荷和性能方面的提高
在自动化程度方面的一个引起争论的问题已得到解决,从而使得分析程序在用于“活动服务器页 (ASP)”时能够进行实质性地缩放。这意味着在多处理器计算机上,使用 XML 的 .asp 文件的吞吐量将显著提高。下面的图表显示了这些提高的情况,其中 x 轴表示处理器的数量,y 轴表示每秒钟 ASP 请求的数量:
这是根据使用执行一些 DOM 树操作的简单 XML .asp 页而测出的。
此外,还改正了一些工作负荷所导致的错误,因而大大提高了分析程序在工作负荷时的稳定性。我们将此分析程序部署到 Microsoft.com 的一些用户访问最频繁的站点,证明了其在工作负荷下的稳定性得到了很大提高。
Charlie Heinemann 是 Microsoft 的 XML 小组的策划经理。他来自德克萨斯州,擅长高屋建瓴地思考问题。