目录
可扩展标记语言 (XML) 是 Web 上的数据通用语言。它使开发人员能够将结构化数据,从许多不同的应用程序传递到桌面,进行本地计算和演示。XML 允许为特定应用程序创建唯一的数据格式。它还是在服务器之间传输结构化数据的理想格式。
MSXML 是提供核心 XML 服务的 Microsoft 软件组件。
最新版本的 Microsoft 核心 XML 服务提供下面四种不同的功能。
所有四种功能都包含在同一 MSXML 库软件包中,它可以从 MSDN XML 开发人员中心(英文)免费得到。
MSXML、MSXML2 和 MSXML3 之间的区别是什么?
在过去三年中 XML 经历了许多反复,所以目前存在不同版本的 Microsoft XML 分析器也不奇怪。Internet Explorer 4.0 包含早期版本的 XML 分析器,它比 XSL、XML 数据或者大多数其他的 XML 技术(并且有完全不同的 DOM 模型)要早。该早期版本的分析器包含在 MSXML.dll 库中。从 MSDN XML 开发人员中心(英文)可将分析器升级到较新的一种。
我们极力建议您升级到新的分析器,因为它要强大得多。Internet Explorer 5.0 包括 MSXML 2.0 分析器,它包含 XSL 和 XML 架构的基本版本。MSXML2 是 SQL Server 2000 附带的分析器版本。MSXML2 包含了许多性能增强的功能,并且在总体上提高了性能和可伸缩性。MSXML3 是当前作为“技术预览”附带的版本。MSXML3 包括 XSLT 和 XPath 支持以及 SAX 接口。
XML 比 HTML 提供更大的灵活性,但是它不可能很快代替 HTML。实际上,XML 和 HTML 能够很好地在一起工作。Microsoft 希望许多作者和开发人员都能同时使用 XML 和 HTML,比如用 XSLT 来生成 HTML。
在 Web 上使用 XML 的好处有:
不。和 HTML 文档一样,XML 文档可以由任何人创建 — 甚至是没有任何编程经验的人。XML 仅仅是一种描述信息的标准方式。此外,它还是一种语言,可以在没有任何软件的情况下用它来编写。您可以在文本编辑器中编写 XML 文档,并且直接放入 Web 站点,不需要编写传统方式下的任何代码。
要使用 XML,您需要能够读取 XMl 文档的 XML 分析器,并且使它的内容能被处理。Microsoft 提供了一种分析器,可以从 MSDN XML 开发人员中心(英文)下载。
要使用 XML 文档,可以使用文本编辑器(例如记事本)或任何其他可以用于创建 HTML 页面的编辑器。要创建完整形式的 XML 应用程序,请使用诸如 Microsoft® Visual Studio® 的编程环境。
XML 正在数量惊人的应用程序中使用,范围从 Web 站点创建和文档化到数据库集成和分布式编程。在下面几个领域中,XML 有其用武之地:
如果您想在 Internet 世界中竞争的话,那就不可以忽略 XML。XML 是导致以我们考虑编程本身的方式进行模式转移的一种语言。传统的专用客户机/服务器应用程序,正在给“随时随地访问”的 Internet 服务让位,XML 是处理任何事情(从数据访问处理到在该新环境中表现数据)的逻辑媒体。
Microsoft Internet Explorer 4.0 支持 XML 吗?
是的。Internet Explorer 4.0 支持 XML 下列功能:
Internet Explorer 5.0 对 XML 提供哪个级别的支持?
Internet Explorer 5 提供下列 XML 支持:
HTML 可以和 CSS 一起用于格式化和表示超链接页面。动态 HTML,通过 DOM,使 HTML 中的所有元素,都可以通过与语言无关的脚本和其他编程语言来访问,从而在很大程度上提高了客户机端的交互能力,而且不需要对服务器的额外需求。页面的对象模型允许动态更改任何方面的内容(包括增加、删除和移动)。
通过为结构化数据添加 XML,为开发人员提供了构造下一代丰富、灵活 Web 应用程序的技术。使用 XML,他们可以为桌面提供结构化数据,并且用 XML 对象模型计算数据。现在的开发人员可以在浏览器(例如 Microsoft Internet Explorer 4.0 和 Microsoft Internet Explorer 5)或者其他应用程序中,通过脚本显示基于 XML 的数据。此外,他们也可以对数据应用格式化规则,而不需要使用 XSLT 样式表的复杂脚本(实际上是将基于 XML 的数据转换为显示)。这两种显示基于 XML 数据的方法,都使得生成复杂数据的多个视图成为可能。
XML 将成为计算领域的未来。作为一种技术,它的影响力将渗透到编程的每个方面,从嵌入式系统到图形界面,到分布式系统以及数据库管理。它实际上已经成为软件工业之间数据通信的标准,并且迅速代替 EDI 系统成为全球几乎所有工业进行业务交换的主要媒体。它很有可能会成为创建和存储大多数文档的语言,不管是否在 Internet 上,并且有可能成为 Internet 应用程序服务器的基础,有些人相信它将代替许多目前生产的小包装产品。
Microsoft 正在努力为许多领域开发 XML 资源:
一般来说,压缩 XML 的需要是与应用程序有关的,并且很大程度上是服务器和客户机之间移动数据量的函数。用于描述数据结构的标记的反复特性,使 XML 能够非常好地压缩数据。值得注意的是 HTTP 1.1 服务器和客户机的压缩都是标准的,XML 可以自动从中受益。
XML 作为数据格式有多安全?有没有增加 XML 安全性的计划?
XML 和 HTML 一样安全。正因为安全的 HTTP (HTTPS) 可以用于对 HTTP 添加密码技术,从而保护了 HTML,因此它也可以用于保护 XML。XML 是表示结构化数据的基于文本格式。这可以使数据的简单性和互操作性最大化。对 XML 格式增加安全性和验证能力时可以采取许多步骤。首先,XML 可以在传输到客户之前在服务器上加密,然后在客户机上解密。应用于数据本身的数字签名也可以验证 XML。
文档类型定义 (DTD) 定义了一类 XML 文档的正确语法。也就是说,它列出了许多元素名称,什么元素可以和其他元素一起显示,什么属性可以用于每种元素类型等等。DTD 使用 XML 文档使用的不同语法形式。
Web 开发人员在使用 XML 描述数据时必须包括 DTD 吗?
不。XML 可以用于描述有或没有 DTD 的数据。术语“有效”XML 指代引用 DTD 的 XML 数据,而“良好形成的”XML 是未使用 DTD 的 XML。此外,“良好形成的”XML 还是 XML 和标准统一标记语言 (SGML) 的基本区别之一。很明显,在这两种情况下,XML 本身都必须遵守语言的标准(例如,所有标记都必须是闭合的,并且标记不能重叠)。
虽然 XML 1.0 提供了定义 XML 文档的内容模型的机制 — DTD — 但是很明显还需要定义内容模型的更全面更有效的方法。XML 架构是特殊的 XML 结构的定义(从其组织和数据类型两个方面)。XML 架构使用“XML 架构”语言来指定在架构中如何定义元素的每种类型,以及与元素关联的数据类型。与 DTD 相比,架构的最鲜明的特点,便是架构本身就是 XML 文档。这意味着阅读它所描述的 XML 的工具也可以阅读它。
Microsoft 的 XML 服务目前支持 XML 数据架构,它代表了在 1999 年 3 月 Internet Explorer 5 装运时 “W3C 架构”活动的快照。XML 数据架构允许开发人员在他们的 XML 文档中添加数据类型,以及定义开放的内容模型。这种对 DTD 功能的扩展对 XML 编程很关键。
但是 W3C 正在准备“XML 架构定义 (XSD)”,它将成为“XML 架构标准”。Microsoft 计划在此规范成为建议后,立即使对“XML 架构定义 (XSD)”的支持成为它核心 XML 服务的一部分。
名称空间是 XML 的另一个高级功能,并作为 XML 1.0 规范的一部分,在 W3C 笔记中作了概述。它们允许开发人员限定元素名称和关系。名称空间使元素名称唯一可识别,从而避免了名称相同,但是在不同词典中定义的元素之间发生名称冲突。它们允许混合来自不同名称空间的标记,这一点对多个来源的数据很重要。
例如,书店可以定义 <TITLE> 标记代表书名,它只包含在 <BOOK> 元素中。但是,个人目录可以定义 <TITLE> 代表个人的职位,例如:
<TITLE>President</TITLE>
名称空间有助于清晰地定义这种差别。
XSLT(英文) ,或者用于转换的可扩展样式表语言,它是在 1999 年 11 月 6 日获得批准的 W3C 建议。从标记和编程两重意义上说,这种语言提供了将 XML 结构转换到其他 XML 结构、HTML 或者任何数量的其他文本格式(例如 SQL)的机制。虽然它可以用于创建 Web 页面的显示输出,但是 XSLT 的实际功能在于能够改变底层结构,而不是简单地改变这些结构的媒体表示,就像在层叠样式表 (CSS) 中一样。
XSL、XQL、XSL 模式 和 XSLT 之间的区别是什么?
XSLT 源自 CSS 在对 XML 文档结构改动上的局限性,当时创建 XML 的原因更倾向于代替 HTML 而不是提供通用数据描述语言。因此可扩展样式表语言 (XSL) 成为构造格式化 XML 新方法的成果。
但是,“W3C 样式工作”组的成员和早期 XML 采用者很快就发现,能够将 XML 从一种格式转换到另一个格式的语言,可以极大地简化生成的大量代码。Microsoft 向 W3C 提交了一个建议,最初名称为 XML 查询语言(或 XQL),它随之被 W3C 采纳为 XSL 模式语言。该语言的大多数功能最终都被纳入了 XSLT 规范中。
最终标准结合了为不同初始条件而修改的 XSLT 参数,创建代码功能块的命名模板,以及大量用于数值和字符串处理的增强功能。XSLT 还为在语言中添加内置功能提供方便,提供了 Microsoft 可在自己的实现中用来添加许多极其有用功能(包括访问 COM 对象和脚本)的产品。
XPath(英文) 是为 XML 定义的查询语言,它提供在文档中选择节点子集的简单语法。通过 XPath,通过指定类似于目录的路径(即名称)以及路径中的条件,可以检索元素集合。XPath 对 XSLT 和 XML DOM 都很重要,并与 XPointer 规范(允许根据统一资源定位符 [URL] 和 XPath 表达式的组合来选择文档片断)有联系。
XSLT 是将一种 XML 文档转换为另一种的语言。这意味着它提供了单源 XML 数据的机制,可以在 Web 页面中创建由用户动态更改的丰富视图,可以为目标通信过滤数据。XSLT 对于业务规则编码已经足够强大。它可以从数据生成图形(不仅仅是 Web 页面)。它甚至可以处理与其他服务器的通信 — 特别是和能够集成到 XSLT 中的脚本模块协作 — 以及在 XSLT 自身内部生成适当的消息。虽然它不可能代替桌面系统中的大多数交互(出于性能和使用方便性两方面分原因),但是在未来的几年中,XSLT 很有可能最终成为系统之间进行通信的主要“编程”语言。
层叠样式表 (CSS) 的任务是对 HTML 元素指定一组显示属性。CSS 决定了页面的视觉外观,但是不会改变源文档的结构。
另一方面,XSLT 也称为基于模板的语言,它允许将某种模式映射到源文档中,该源文档的输出是用 XML、HTML 或纯文本书写的。使用 XSLT,可以将 XML 文档的结构转换为不同的 XML 文档。例如,您可以更改 XML 文档的顺序、添加或删除元素、执行条件测试或者用元素的集合进行迭代。
XSLT 和 CSS 不是兼容标准。一种在 XML 中创建 Web 页面的有用技术,是用 XSLT 将 XML 转换为诸如列表或表的结构,然后将 CSS 应用于结果,控制这些结构在适当媒体中的显示。您甚至可以从 XSLT 创建 CSS。
从 XML 语言开始产生起,Microsoft 就站在了 XML 的最前沿,而且很值得注意的是,W3C 在过去几年中所生成的大多数 XML 建议和工作草案,都包括来自至少一个(在某些情况下可能是数个)Microsoft 职员的输入和参与。Microsoft 已经多次被委以重任,与 W3C 标准组织一起,确保 XML 的开发能使所有用户受益,并且在许多不同领域的开发中都作出了重要贡献,包括 XML 规范、DOM、XSLT 和架构定义语言。Microsoft 承诺将与最新规范和标准保持一致。
XML 和 World Wide Web Consortium (W3C) 之间的关系是什么?
W3C 有一活跃的 XML 工作组。Microsoft 从 1996 年 6 月起就是该组织的共同发起者之一,从那时起许多业界企业都开始加入,包括 Netscape Communications Corp.、IBM 和 Oracle。有关 XML 标准过程的详细信息,请访问 W3C Web 站点(英文)。
XML 1.0 是在 1998 年 12 月被正式批准的,现在仍是个稳定的标准。有关当前 XML 规范的详细信息以及 W3C 内部的提交和审阅过程,请参见 W3C Web 站点(英文)。
DOM Level 1 的 W3C 文档状态为“推荐”。这说明 W3C 目前正在提议将它作为 World Wide Web 上的标准。有关 DOM 和在 W3C 内部提交和审阅过程的详细信息,请参见 DOM 规范(英文)。
Microsoft ActiveX 数据对象 (ADO) 技术,提供许多将数据库记录集(数据记录集合)转换为 XML 格式的方法,以及从给定结构中获取 XML 并将其转换回 ADO 所支持数据库(包括 SQL Server 和 Oracle 数据库)的工具。此外,通过 MSXML2 和 MSXML3 中的 XML 数据源对象,还可以将任意 XML 直接加载到 ADO 中以生成记录集。
SQL Server 2000 还允许通过 URL 直接设置和检索 XML,方式和调用 Web 页面非常相似。这是处理数据的强大机制,因为它基本上意味着可以将 SQL Server 数据直接集成到 XML 过滤器和 Web 页面,基本上凡是有 XML 文档的地方都可以集成 SQL Server 数据。此外,还可以设置自定义模板,来控制如何从 SQL Server 数据中产生 XML,使数据库成为生成 XHTML 页面的强大工具。
最后,诸如 BizTalk Server 这样的应用程序还允许在任意数量的不同数据源(从 XML 文档到数据库到 Excel 和 Word 文档)之间进行映射、为 Web 体系结构创建复杂数据管道以及根据 XML 数据库需求构造有效的架构。
目前有 Microsoft 工具可以帮助我快速沿用 XML 吗?
Microsoft BizTalk Server 2000 是用于数据交换的、基于 XML 的服务器,它提供启用电子商务业务社会的基本结构和工具。BizTalk Server 的基础是基于规则的业务文档路由、转换和跟踪基本结构。该基本结构允许公司通过在组织边界之内或之间的应用程序中间交换业务文档,例如购买定单和发票,来集成、管理和自动化业务过程。有关详细信息,请参见Microsoft BizTalk Server 2000(英文) 。
SOAP 是简单对象访问协议,是创建大范围分布式、复杂计算环境的工具,该计算环境可使用现有的 Internet 基本结构运行在 Internet 上。SOAP 可以使应用程序用许许多多方法在 Internet 上互相直接通信。有关 SOAP 的详细信息,请参见 SOAP 规范(英文)。
XML 如何适用于 Microsoft Windows® Distributed InterNet Applications (Windows DNA) 策略来构造三层并具有 Web 功能的应用程序?
XML 正在快速成为将结构化数据从中间层传送到桌面的工具。基于 XML 的数据可以通过中间层代理与多种后端(数据库)源集成。架构(参见“XML 数据”一节)可以改进该过程,并且开发人员可以更精确地描述和交换数据。
为什么在调用了 Load() 方法后,我的文档对象仍然为空?
默认情况下操作是异步加载的。这意味着如果提供 http URL 地址,那么 load() 方法将直接返回,并且文档对象仍然为空,因为数据还没有从服务器返回。为了纠正这个问题,请在代码中添加下面的行:
xmldoc.async = false;同时,如果是从独立的 C++ 应用程序加载 http XML 文档,那么必须查询消息队列才能继续加载。
文档可以包含外国字符,例如:
<test>foreign characters (úóíÿ) </test>例如 磲 的外国字符必须在前面加上 escape 序列。外国字符可以是 UTF-8 编码或用不同编码指定,如下所示:
<?xml version="1.0" encoding="iso-8859-1"?><test>foreign characters (磲) </test>
现在可以正确加载 XML 了。
其他字符是保留在 XML 中的,并且需要以不同的方式处理。下面的 XML:
<foo>This & that</foo>产生如下错误:
此处不允许有空格。行 0000001: <foo>This & that</foo>位置 0000012: ----------^
此处 & 是 XML 句法结构的一部分,如果它仅仅放在 XML 数据源内部,那么不能解释为 &。您需要替换称为“实体”的特殊字符序列。
<foo>This & that</foo>
下面的字符需要相应的实体:
< <& &> >" "' '引号字符被用作标记中属性值的定界符,因此通常不能在属性值的内部使用。例如,下面的内容将返回错误:
<foo description="John´s Stuff">
此处的单引号既用作属性定界符,又在属性值自身中。为了纠正这个问题,可以将属性定界符换成双引号:
<foo description="John´s Stuff">
或者可以将单引号转义为实体 '
<foo description="John' Stuff">上述两种方式都将通过 XML 对象模型中的 getAttribute 方法返回属性值 John's Stuff。同样,对于双引号,您可以使用实体
"。
也可以通过将文本放在 CDATA 节中来处理元素内容中的特殊字符。下面的内容是正确的:
<xml> <![CDATA[ This & that <stuff> is just "text" content。 ]]></xml>
在本例子中,XML 对象模型将 CDATA 节点显示 xml 节点的子节点,它将返回字符串
This & that <stuff> is just "text" content.
作为 nodeValue。
如何在 Visual Studio 6.0 C++ 中使用 MSXML COM 组件?
在 Visual C++ 6.0 中使用 MSXML COM 组件的最简便方式是使用 #import 指令:
#import "msxml.dll" named_guids no_namespace#import "msxml.dll" named_guids no_namespace它定义了所有 IXML* 接口和接口 ID,从而可以在应用程序中使用它们了。也可以从 INETSDK 获取 MSXML 类型库和头文件(英文),以及包含类 IIDs 的 uuid.lib。
下面的 XML 包含 HTML 实体:
<copyright>Copyright © 2000, Microsoft Inc, All rights reserved.</copyright>
它产生下列错误:
引用未定义的实体 'copy'。行: 1, 位置:23, 错误码:0xC00CE002<copyright>Copyright © 2000, ...----------------------^
这是因为 XML 只有五个内置实体。关于内置实体的详细信息,请参阅如何加载有外国和特殊字符的文档?。
要使用 HTML 实体,需要用 DTD 定义它们。有关 DTD 的详细信息,请参阅 W3C XML 建议(英文)。要使用该 DTD,请将它直接包括在 DOCTYPE 标记中,如下所示:<!DOCTYPE foo SYSTEM "http://msdn.microsoft.com/xml/general/htmlentities.dtd"><copyright>Copyright © 2000, Microsoft Inc, All rights reserved.</copyright>
要加载它,需要关闭 IXMLDOMDocument 接口的 validateOnParse 属性。请尝试将它粘贴到“Validator 测试页”中,关闭 DTD 验证,然后单击“验证”。请注意文档将加载,并且版权字符将显示在 validator 页面的末尾的 DOM 树中。
如果已经完成了 DTD 验证,那么必须将作为参数实体的 HTML 实体包括在现有的 DTD 中,如下所示:<!ENTITY % HTMLENT SYSTEM "http://msdn.microsoft.com/xml/general/htmlentities.dtd">%HTMLENT;<!ENTITY % HTMLENT SYSTEM "http://msdn.microsoft.com/xml/general/htmlentities.dtd">%HTMLENT;它将定义所有 HTML 实体,以便在 XML 文档中使用它们。
XML DOM 有三种访问元素文本内容的方式:
属性 | 行为 |
nodeValue | 按照原始的 XML 源中指定的那样,返回 TEXT、CDATA、COMMENT 和 PI 节点上的原始文本内容(包括空白字符)。对于 ELEMENT 节点和 DOCUMENT 本身,则返回空值。 |
数据 | 与 nodeValue 相同 |
文本 | 重复连接指定子树中的多个 TEXT 和 CDATA 节点并返回组合结果。 |
注意: 空白字符包括新行、tab 和空格。
nodeValue 属性通常返回原始文档中的内容,与文档如何加载和当前 xml:space 范围无关。
文本属性连接指定子树中的所有文本并扩展实体。这与文档如何加载、preserveWhiteSpace 开关的当前状态和当前 xml:space 范围有关,请看如下所示:
preserveWhiteSpace = true when the document is loadedpreserveWhiteSpace=true | preserveWhiteSpace=true | preserveWhiteSpace=false | preserveWhiteSpace=false |
xml:space=preserve | xml:space=default | xml:space=preserve | xml:space=default |
保留 | 保留 | 保留 | 保留并截断 |
preserveWhiteSpace = false when the document is loaded
preserveWhiteSpace=true | preserveWhiteSpace=true | preserveWhiteSpace=false | preserveWhiteSpace=false |
xml:space=preserve | xml:space=default | xml:space=preserve | xml:space=default |
半保留 | 半保留并截断 | 半保留 | 半保留并截断 |
此处的保留表示和原始 XML 文档中完全相同的原始文本内容,截断意味着前导和尾部空格已经删除,半保留意味着保留了“重要的空白字符”并规范化了“不重要的空白字符”。重要的空白字符是文本内容内部的空白字符。不重要的空白字符是标记之间的空白字符,请看如下所示:
<name>\n\t<first> Jane</first>\n\t<last>Smith </last>\n</name>
在本示例中,红色是可以忽略的不重要的空白字符,而绿色是重要的空白字符,因为它是文本内容的一部分,因此有不可忽略的重要含义。所以在本例中,文本属性返回下列结果:
状态 | 返回值 |
保留 | "\n\t Jane\n\tSmith \n" |
保留并截断 | "Jane\n\tSmith" |
半保留 | " Jane Smith " |
半保留并截断 | "Jane Smith" |
请注意“半保留”将规范化不重要的空白字符,例如,新行和 tab 字符将退化为单个空格。如果更改 xml:space 属性和 preserveWhiteSpace 开关,那么文本属性将返回相应的不同值。
CDATA and xml:space="preserve" subtree boundaries在下面的例子中,CDATA 节点或“保留”节点的内容将得到连接,原因是它们不参与不重要的空白字符规范化。例如:
<name>\n\t<first> Jane </first>\n\t<last><![CDATA[ Smith ]></last>\n</name>
在这种情况下,CDATA 节点内部的空白字符不再与“不重要”空白字符“合并”,并且不会截断。因此“半保留并截断”情况将返回下列内容:
"Jane Smith "
在此,</first> 和 <last> 标记之间的不重要的空白字符将包括在内,与 CDATA 节点的内容无关。如果用下列内容代替 CDATA,那么将返回相同结果:
<last xml:space="preserve"> Smith </last>
实体是特殊的
实体是作为 DTD 的一部分加载和分析的,并且显示在 DOCTYPE 节点下。它们不一定要有任何 xml:space 范围。例如:
<!DOCTYPE foo [<!ENTITY Jane "<employee>\n\t<name> Jane </name>\n\t<title>Software Design Engineer</title>\n</employee>">]><foo xml:space="preserve">&Jane;</foo>
假定 preserveWhiteSpace=false(在 DOCTYPE 标记范围内),在分析实体时不重要的空白字符丢失。实体将不会有空白字符节点。树将类似于:
DOCTYPE foo ENTITY: Jane ELEMENT: employee ELEMENT: name TEXT: Jane ELEMENT: title TEXT>:Software Design Engineer ELEMENT: foo ATTRIBUTE: xml:space="preserve" ENTITYREF: Jane
请注意,在 DOCTYPE 内部 ENTITY 节点下显露的 DOM 树不包含任何 WHITESPACE 节点。这意味着 ENTITYREF 节点的子节点也没有 WHITESPACE 节点,即使实体引用在 xml:space="preserve" 的范围内也是这样。
给定文档中引用的每个 ENTITY 的实例通常都有相同的树。
如果实体必须绝对保留空白字符,那么它必须在自己内部指定自己的 xml:space 属性,或者文档 preserveWhiteSpace 开关必须设置为 true。
有几种方式可以访问属性值。IXMLDOMAttribute 接口有 nodeValue 属性,它等价于作为 Microsoft 扩展的 nodeValue 和 text 属性。这些属性返回:
属性 | 返回的文本 |
attrNode.nodeValue attrNode.value getAttribute("name") |
返回和原始文档中完全相同的内容(和扩展的实体)。 |
attrNode.nodeTypedValue | Null |
attrNode.text | 除了前导和尾部的空白字符已经截断之外,其他与 nodeValue 相同。 |
“XML 语言”规范为 XML 应用程序定义了下列行为:
属性类型 | 返回的文本 |
CDATA | ID、IDREF、IDREFS、ENTITY、ENTITIES、NOTATION、枚举 |
半规范化 | 全规范化 |
有些时候,XML 对象模型将显示包含空白字符的 TEXT 节点。空白字符被截断后,多半会带来一些混乱。例如下面的 XML 例子:
<?xml version="1.0" ?><!DOCTYPE person [ <!ELEMENT person (#PCDATA|lastname|firstname)> <!ELEMENT lastname (#PCDATA)> <!ELEMENT firstname (#PCDATA)>]><person> <lastname>Smith</lastname> <firstname>John</firstname></person>
生成下列树:
Processing Instruction: xmlDocType: personELEMENT: person TEXT: ELEMENT: lastname TEXT: ELEMENT: firstname TEXT:
名字和姓氏两边是只包含空白字符的 TEXT 节点,因为“person”元素的内容模型是 MIXED;它包含 #PCDATA 关键字。MIXED 内容模型指定元素之间可以有文本存在。因此,下面的内容也是正确的:
<person>My last name is <lastname>Smith</lastname> and my first name is<firstname>John</firstname></person>
结果是类似于下面的树:
ELEMENT: person TEXT: My last name is ELEMENT: lastname TEXT: and my first name is ELEMENT: firstname TEXT:
如果没有单词“is”之后和 <lastname>之前的空白字符,以及 </lastname>之后和单词“and”之前的空白字符,那么句子便无法理解。因此,对于 MIXED 内容模型来说,文字组合、空白字符和元素都是相关的。对于非 MIXED 内容模型来说则不是这样。
要使只有空白字符的 TEXT 节点消失,请从“person”元素声明中删除 #PCDATA 关键字:
<!ELEMENT person (lastname,firstname)>
结果是下面清晰的树:
Processing Instruction: xmlDocType: personELEMENT: person ELEMENT: lastname ELEMENT: firstname
XML 声明必须列在 XML 文档的顶部:
<?xml version="1.0" encoding="utf-8"?>
它指定下面的项目:
注意:XML 声明必须在 XML 文档的第一行,因此下面的 XML 文件:
<!--HEADLINE="Dow closes as techs get hammered"--><?xml version="1.0"?>
产生下面的分析错误:
无效的 xml 声明。行 0000002: <?xml version="1.0"?>位置 0000007: ------^
注意:XML 声明是可选的。如果需要在顶部指定注释或者处理指令,那么请不要放入 XML 声明。但是,默认的编码将为 UTF-8。
在用 DOM 从零开始构造文档以产生 XML 文件时,任何内容都在一行上,相互之间没有空格。这是默认的行为。
构造在 Internet Explorer 5 中的默认 XSL 样式表,以可读格式显示和打印 XML 文档。例如,如果已经安装了 IE5,请尝试查看 nospace.xml 文件。浏览器中应该显示下面的树:
- <ORDER> - <ITEM NAME="123"> <NAME>XYZ</NAME> <PRICE>12.56</PRICE> </ITEM> </ORDER>
在 XML 中没有插入空白字符。
打印可读 XML 是非常有趣的,特别是有定义不同类型内容模型的 DTD 时。例如,在混合内容模型 (#PCDATA) 下不能插入空格,因为它可能改变内容的含义。比如请考虑下面的 XML:
<B>E</B><I>lephant</I>
这最好不输出为:
<B>E</B><I>lephant</I>
因为单词边界不再正确。
所有这些都使自动化打印成为问题。如果不需要打印可读 XML,那么可以使用 DOM 在适当的位置插入空白字符作为文本节点。
如何在 DTD 中使用名称空间? 要在 DTD 中使用名称空间,请在使用它的元素的 ATTLIST 声明中声明它,如下所示:
<!ELEMENT x:customer ANY ><!ATTLIST x:customer xmlns:x CDATA #FIXED "urn:...">名称空间类型必须为 #FIXED。属性的名称空间也是这样:
<!ELEMENT customer ANY ><!ATTLIST customer x:value CDATA #IMPLIED xmlns:x CDATA #FIXED "urn:...">名称空间和 XML 架构
DTD 和 XML 架构不能混合。例如,下面的
xmlns:x CDATA #FIXED "x-schema:myschema.xml"将不导致使用在 myschema.xml 中定义的架构定义。对 DTD 和 XML 架构的使用是互斥的。
使用下面的 XML 作为例子:
<contacts> <person> <name>Mark Hanson</name> <telephone>206 765 4583</telephone> </person> <person> <name>Jane Smith</name> <telephone>425 808 1111</telephone> </person></contacts>可以按如下方式绑定到 ADO 记录集:
Dim dso As New XMLDSOControlDim doc As IXMLDOMDocumentSet doc = dso.XMLDocumentdoc.Load ("d:\test.xml")
Dim da As New DataAdapterSet da.Object = dsoDim rs As New ADODB.RecordsetSet rs.DataSource = da
MsgBox rs.Fields("name").Value结果显示字符串“Mark Hanson”
必须已经安装 MSXML.DLL 的 IE5 版本。在 Visual J++ 6.0 中,从项目菜单选择添加 COM 包装程序,然后从 COM 对象列表中选择“Microsoft XML 1.0”。该操作将把所需的 Java 包装程序构造到称为“msxml”的新软件包中。这些预先构造的 Java 包装程序也可以下载。类可以按如下方法使用:
import com.ms.com.*;import msxml.*;
public class Class1{ public static void main (String[] args) { DOMDocument doc = new DOMDocument(); doc.load(new Variant("file://d:/samples/ot.xml")); System.out.println("Loaded " + doc.getDocumentElement().getNodeName()); }}
代码示例将从 sun religion 示例中加载 3.8MB 测试文件“ot.xml”。Variant 类用于包装 Win32 VARIANT 基本类型。
因为在每次检索节点时实际上都获得了新的包装程序,因此不能在节点上使用指针比较。因此,不要使用下面的代码,
IXMLDOMNode root1 = doc.getDocumentElement();IXMLDOMNode root2 = doc.getDocumentElement();if (root1 == root2)...
而要使用下面的代码:
if (ComLib.isEqualUnknown(root1, root2)) ....
.class 包装程序的总大小大约为 160KB。但是,为了与 W3C 规范完全符合,应该只使用 IXMLDOM* 包装程序。下面的类是旧的 IE 4.0 XML 接口,可以从 msxml 文件夹中删除它们:
这使大小减少为 147KB。同时还可以删除下面的项目:
这可以将大小减少到 116KB。要使它更小,请考虑 DOM 本身有两层的事实:核心层包括:
和用户可能需要保留的 DTD 信息:
XML 文档中的所有节点类型都是 IXMLDOMNode,它提供全部功能,但是存在每种节点类型的更高级别的包装程序。因此,如果修改 DOMDocument 包装程序并将这些特定类型更改为使用 IXMLDOMNode,那么所有下面的接口都可以删除:
删除这些将使大小减少到 61KB。但是,对 IXMLDOMElement 来说,getAttribute 和 setAttribute 方法都是有用的。否则需要使用:
IXMLDOMNode.getAttributes().setNamedItem(...)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3478