然而,基于DOM的解析必须将XML文档整个读入内存中,所以当遇到较大的XML文档时,DOM解析可能会变得较慢而且比较消耗内存。很难准确判断何种XML文档才是过大的,因为处理时间会根据处理能力、内存、可用时间以及是否在单用户或多用户环境下工作(比如Web服务器)而变化。一般而言,大多数系统可以处理大至几十兆的文件,但是对于更大的文件就需要十分小心了。
另一方面,基于SAX的模型是串行操作的。一个节点被处理后就被丢弃了,并且不会再被处理。整个文档并不一次性地读入内存,这样就避免了由较大的XML文档而引起的处理问题。这种处理方法将由用户负责保存XML文档中的可供后续使用的信息。
举例来说,对于一个通信系统的中间路由程序来说,SAX是理想的。一个读入的XML文档通常只有一个很小的路由首部信息,但却有需要发送到终点的较大文档。使用SAX模型时,路由设备可以仅读取路由信息而忽略掉整个文档,因为文档与传送并无关系。然而,基于DOM的解析器却需要在读取整个文档后才可以将之传送到终点。
1.5 一些XML工具
开发者通常都希望了解有哪些工具可以用于操作XML文档。可用的工具有很多,有免费的也有需要购买的,这里不可能将它们都汇总起来。对工具的选择可能更取决于个人的喜好。
总地来说,XML开发工具分为几类:
l 现有编程IDE的扩展; l XML专用的IDE; l 独立工具。
诸如Microsoft Visual Studio(http://msdn.microsoft.com/vstudio/)的开发工具就属于第一类。它们有专门针对开发者的对XML的良好支持。在本书写作时,它的最新版本是Visual Studio 2005,主要具有以下特性:
l 它可以帮助建立和编辑XML文档,并且可以检查文档是否是合式的;
l 提供对XML模式的支持,包括可以从文档实例、文档有效性和DTD中推导模式; l 提供对XSLT的支持,包括可以查看转换的结果。
专用的XML IDE大多具有相似的基础功能,而在支持程度和用户界面上差别较大。大多数这些工具都有一个XML编辑器、用于创建DTD和XML模式的工具以及对XSLT开发的支持。这样的工具有不少,以下是其中常见的一小部分:
l Altova的XML组件:http://www.altova.com/suite.html;
l TIBCO Software的XML工具组件:http://www.tibco.com/software/business_integration/xml_ tools.jsp; l DataDirect Technology的Stylus Studio:http://www.stylusstudio.com/。
上面提到的这些组件大多都包含编辑XML文档的工具。其中有:
l Altova的XMLSpy:http://www.altova.com/products_ide.html;
l Blast Radius 的XMetal:http://www.xmetal.com/index.x?products/xmetal/; l SyncRO Soft的
除此之外,还有很多非常好的工具。你可以在因特网上搜索,也可以加入到一些邮件列表中,比如XML-DEV(http://xml.org/xml/xmldev/shtml)。
1.6 小结
本章介绍了一些与XML相关的基本概念,对某些语法做了较详细的讲解,演示了XML给Web开发者带来的好处,还介绍了一些用于XML文档的工具。
第2章会介绍一些相关的XML推荐标准,以及如何使用DTD和XML模式。另外,还会简单介绍一下XSLT、XPath、XLinks和XPointer。
上一章介绍了XML文档及其构造规则。XML是万维网联盟(W3C)制订的一系列相关推荐标准中的一个。本章将介绍在开发XML应用程序时可能会用到的一些推荐标准。具体而言包括:
l 命名空间在XML中的作用;
l 使用DTD和XML模式来定义XML词汇; l 使用XSLT显示XML;
l 使用XPath在XML文档中导航;
l 使用XLink和XPointer链接到XML文档。
本章使用的文件可以从Apress网站(http://www.apress.com)的源代码区下载。现在,首先看看使用XML文档时命名空间的重要性。
2.1 XML命名空间的作用
XML文档可以创建自定义的元素和属性词汇来描述数据。当XML文档较为复杂或是需要从别的地方取得内容时,一个文档中有可能会需要不止一个词汇,这样就会产生名称相同而含义不同的元素出现在不同词汇中的情况。
例如,如果需要建立一个含有XHTML信息的家具目录:
在这个XML文档中,同样名为的两个元素却有着完全不同的含义。 命名空间可以指明哪个元素属于哪个词汇。它可以为每个词汇指定唯一的前缀进行识别,再将该前缀应用于XML文档中的元素上:
虽然有一些惯例可以遵循,但这里选择的前缀并不理想。在上个例子中,第一个前缀cat表示的是目录项。你同样可以将之称为dog或catalog。第二个前缀xhtml表示的是文档中的XHTML元素。这是一个符合命名空间惯例的例子。
命名空间使用统一资源定位符(URI)来识别每个词汇。在上面包含XHTML内容的例子中,URI是由W3C控制的,因为它控制着XHTML标准。你也可以将cat前缀置于自己的控制之下。
值得注意的是,URI并不一定需要指向一个实际的文档或目录。对它仅有的要求就是,在XML文档中它必须是唯一的。然而很多处理程序,包括XML模式、XHTML和XSLT处理程序,都使用URI来注明它们必须处理文档的某一部分。因此,对于这些应用程序需要使用正确的URI。
在http://www.w3.org/TR/REC-xml-names/中可以找到W3C关于“XML中的命名空间(Namespaces in XML)”的推荐标准。
2.1.1 在XML文档中加入命名空间
为了引用一个命名空间,可以将其以属性的形式加入任何包含了属于该命名空间中元素的节点中。命名空间经常加在文档元素中,因为它包含了所有其他的元素。在上面的XML文档中,最开始的元素可改写为如下形式:
这决定了命名空间cat指向URI http://www.apress.com/ns/furniture。命名空间cat可置于任何元素名字前,并以冒号分开:
2.1.2 添加默认命名空间
一个XML文档的大部分通常都属于一个XML词汇。在这种情况下,可以定义一个默认的命名空间,而不是为每个元素重复地添加命名空间前缀。可以使用xmlns关键字来定义默认的命名空间。这样,就不用为默认命名空间内的元素指定前缀了。
例如,可以将catalog指定为默认命名空间:
现在这是默认的命名空间了,因而就不必再在此命名空间内的元素名前加上前缀了。
可以在文档中的任何位置声明默认命名空间。被声明的默认命名空间适用于包含了声明的元素及其所有子元素,而且会覆盖此前所做的声明。
下面的XML文档演示了如何使用多个默认命名空间:
默认的catalog命名空间适用于除了包含于第二个元素内的所有元素。因为加入了命名空间声明,下面元素默认的就是XHTML命名空间: