XML语法大全
更新时间:2024-06-18 21:39:01 阅读量: 综合文库 文档下载
译 者 序
XML让Web应用程序焕然一新!
在开发者逐步趋向使用浏览器作为Web应用程序的通用客户端之后,浏览器所承担的任务的复杂性也在不断升级。与此同时,Web应用程序相对于传统专用客户端应用程序而言,其用户使用体验的不足也一直为人所诟病。基于浏览器的Web应用程序的发展一直面临着两方面的问题:一是如何使其更适合于实现更为复杂的较大规模的应用;二是如何给用户提供更好的使用体验。
在上述两个方面,XML都发挥了极其重要且不可替代的作用。在程序的结构方面,XML成功地扮演了“胶水”和“信使”的角色,这使程序的层次划分更为清晰而自然。这种结构层次的细化以及层次间耦合度的降低,使Web应用程序成功地进入了更广泛的应用领域,并显示了实现更为复杂的应用逻辑的强大能力。而在提高用户体验方面,由于各种基于XML的相关Web词汇的出现和应用,尤其是以XML为重要基础的Ajax技术和方法的日益普及,使浏览器表现出了毫不逊色于传统专用客户端的表现和交互能力。
可以肯定地说,今天的Web应用程序已经完全离不开XML。熟悉XML的概念和规则,并将其完美地应用于各种技术,已经成为对Web开发者非常重要的基本要求。本书对于XML的讲解全面而深入,并且收集了大量对开发工作非常有价值的资源。对于有志于从事Web开发的人们来说,本书既是一本优秀的XML教材,同时也是一本较全面的XML参考手册。
许劲松 2007年春
本章将介绍XML(可扩展标记语言),并解释它的一些基本概念。如果你对XML还比较陌生,这将是一个理想的起点。这里介绍的概念将在本书后续部分做更详细的阐述。
Web开发者往往对XHTML(可扩展超文本标记语言)很熟悉,但却经常搞不清它与XML的关系,也不清楚自己为什么需要同时学习XML。但是可以肯定的是,对于开发者来说,这两种技术都是重要的。
XML是用来编写其他语言(称为XML词汇)的元语言。XHTML是这些词汇中的一种,所以如果理解了XML,你也就能理解作为XHTML基础的一些规则。XHTML是遵循XML规则的HTML语言,后面我们将会介绍更多有关的内容。
XHTML有很多的局限性。虽然它擅长于组织Web浏览器中的信息并进行显示,但它的主要任务并不是对数据进行标记。XHTML无法提供一些高级功能,如不能对内容进行排序和过滤等。描述XHTML文档内容的标签不能自己进行定义。XHTML的标签是固定的,它们通常无法与其所包含内容的类型进行关联。例如,段落标签是可用于任何类型的内容的通用容器。
XML解决了这些HTML常见的局限性问题。它比HTML灵活性更高,因为它可以与其他一些支持表现、组织、转换和导航的标准一起工作。XML文档是自描述的,在它们的文档结构中可使用可描述的标签对其所标记的内容进行识别。
本章将更详细地讨论这些问题,对XML做更多的解释并说明为什么需要在你的工作中使用XML。本章将包含以下内容:
l XML的定义及其简史; l 如何编写XML文档; l 如何处理XML内容。
本章将首先介绍XML到底是什么,以及它适合于Web开发的哪些领域。
1.1 XML是什么
对XML第一点也是最重要的一点认识就是,它本身并不是一个编程语言,而是一个用于构造其他语言也就是所谓词汇的元语言。XML描述了创造这些词汇的规则。每种语言都互不相同,但都使用标签来标记内容。标签的名称和结构可自由选择。对于认同标准XML词汇的组织来说,这是通用的,这样他们就可对信息进行共享。
XML语言的一个例子就是XHTML。XHTML描述了一套标准的标签,这些标签只能以一种特定的方式使用。每个XHTML页面包含两个部分,分别使用
和标签描述。每个部分都只能包含特定的标签。例如,不能将标签置于部分中。世界各地的Web开发者都有一个共同的标准方法,这样浏览器就知道如何来呈现XHTML标签了。XML是W3C(万维网联盟)的推荐标准,这意味着它是可以免费使用的。W3C在它的术语表(http://www.w3.org/TR/DOM-Level-2-Core/glossary.html)中提供了一个关于XML的更正式的定义,内容如下:
XML(可扩展标记语言)是SGML中的一个简单子集。它的目标是使通用的SGML可以如同当前的HTML一样,在网络上进行服务、接收和处理。XML设计得非常便于实现,且与SGML和HTML都具有互操作性。
1.1.1 XML简史
XML于1998年问世,它是基于SGML(标准通用标记语言)的。SGML是一个国际标准,可以将其理解为是定义其他文档标记语言的语言。HTML是基于SGML的。SGML最主要的问题是它难于使用,而XML的目标就是要变得更简单。
XML也从HTML中获益良多。HTML专注于内容的显示;你不能用它来完成诸如排序和过滤等更高级的功能。HTML不是一个非常精确的语言,它不区分大小写。即使不正确的HTML内容也可能被某个浏览器正确地进行显示。
XML纠正了HTML中的很多缺陷。1999年,HTML被使用XML语言构造规则改写为XHTML。XHTML文档的构造规则比HTML的要精确得多。这些规则的严格程度取决于在XHTML页面中所指定的文档类型声明(DOCTYPE)。第3章将对DOCTYPE进行更多的讨论。
从1998年起,XML已明显成为管理信息的一个强有力的方法。XML文档使数据易于共享。一系列相关的W3C推荐标准解决了在XML文档内进行转换、显示和导航的问题。第2章将会详细介绍这些推荐标准。
XML的要点总结如下:
l XML不是一个语言,它的规则用来构造其他语言;
l XML创建了用来标记内容的基于标签的语言;
l XHTML是由XML创建的语言的一种,也是对HTML的重新构造; l XML是基于SGML的。
1.1.2 XML的目标
SGML的异常复杂使W3C非常清楚地看到XML所要达到的目标。这些目标可参见http://www.w3.org/TR/REC-xml/#sec-origin-goals:
(1) XML应该在因特网上易用; (2) XML应支持多种不同的应用; (3) XML应与SGML兼容;
(4) 处理XML文档的程序应易于编写;
(5) XML中的可选特性将减到最小,理想状态为零; (6) XML文档应是清晰、易读的; (7) XML的设计应该比较快捷; (8) XML的设计应该是形式化而精练的; (9) XML文档应该易于创建; (10) XML不追求标记的简洁。
这些目标中有几点值得注意。第一,W3C希望XML是非常简单的;实际上,好几个目标都包含了“容易”和“清晰”的含义。
第二,W3C赋予了XML两个目标:供人阅读和供XML处理程序处理。XML处理程序或者解析器是用来处理XML文档的软件包。处理程序可以识别XML文档的内容,也可以读、写或修改已存在的文档,或是直接创建新的文档。
其目的是通过保持开发的简单性来打开XML处理程序的市场。严格的构造规则意味着所需要进行的处理会比较少。因而也意味着XML文档可应用于移动设备,诸如手机和PDA。
通过使文档可供人阅读,你可以更方便地使用数据,也可以更容易地开发和调试应用程序。Unicode的应用程序开发者可以使用很多不同的语言创建XML文
档。然而,其产生的问题是XML文档可能变得比较罗嗦,用XML来描述数据也会比采用其他方式更冗长。
Unicode
XML支持Unicode字符集以保证对多语言的支持。Unicode提供对231字符的支持。它包含了你可能需要的每一个字符,同时也有很多是你永远也用不上的。
可以使用8位Unicode转换格式(UTF-8)来编码Unicode字符,从而使得这些字符与它们在ASCII中的编码保持一致。显然,这提供了与老系统更好的兼容性。中文和日语这样的语言需要UTF-16编码。可以在http://www.unicode.org中了解更多关于Unicode的内容。
第三,请注意术语XML文档(document)。这个术语的含义比传统意义上的物理文档更为丰富。一些XML文档以物理形式存在,但另一些是作为遵循XML构造规则的信息流的形式创建的。例如,Web 服务以及内容以XML形式返回的数据库调用结果。
在理解了XML是什么以后,现在来深入地研究XML语言的构造规则。
1.2 XML语法
XML语言使用标签来标记文本。作为Web开发者,你应该很熟悉标记文本的含义:
上面一行是XHTML,同时也是XML。在XHTML中,
标签表示一段文本。XHTML中的所有标签都有预先定义好的含义。
XML允许你创建自己的标签,因而你可以将原先的标记改写为:
在本例中,
使用具有描述性的名字可以使人更易于理解。想像一下读到下面内容时你会遇到的困惑:
下面来总结一下XML的命名规则:
l XML名字不能以数字或标点符号开头; l XML名字不能包含空格;
l 如果不是表示命名空间,就不要在名字中包含冒号; l XML名字是区分大小写的。
下面将更详细地描述XML文档的内容。首先从可能出现在序言中的元素开始。
1.3.3 XML文档序言
XML文档的序言里包含了关于文档本身的元信息,而不是文档的内容。它可能包含XML声明、处理指令、注释以及嵌入的DTD或模式。
1.XML声明
XML文档通常都以一个XML声明开始,虽然这并不是必需的:
在XML文档中,包含一个声明是好的做法,因为它可以告诉应用程序或人随后的是一段XML内容。它还能向处理程序提供关于该文档的额外信息,比如它的字符编码类型。
如果在XML中包含声明,就必须将它置于文档的第一行。任何内容都不能放在XML声明前面,空格也不行。如果你不小心在声明前面放了一个空格,XML处理程序就将无法正确解析文档的内容,并且会产生错误消息。
XML声明中还可以包含一些属性,这些属性提供关于版本、编码以及文档是否独立的信息:
在本书的写作期间,XML的最新版本是1.1。然而,很多处理程序还不支持这个版本,所以最好还是坚持将版本声明为1.0以保持向后兼容。
声明中的encoding属性描述的是XML文档的字符集。如果没有包含encoding属性,则文档会被认为使用UTF-8编码。
声明中的standalone属性的值只能为yes或no。这个值表示要正确处理当前的文档是否还需要外部文件。
XML声明中的每个属性都是可选的,但是它们的顺序很重要。如果需要包含encoding属性,那它必须出现在version属性的后面。而standalone属性只能是声明中的最后一个属性。
2.处理指令
序言中还可包含处理指令(processing instruction,PI),它们将关于XML文档的信息传递给其他应用程序。XML处理程序并不处理PI,而是将它们原封不动地传递给应用程序。
PI以结束。它们通常会在序言中出现,虽然它们也可出现在XML文档内的其他地方。
注解 XML声明也以
下面的PI指定了一个到XSL样式表的引用:
PI中的第一项是一个名字,称为PI目标。上面的PI的名字是xml-stylesheet。以xml开头的名字被保留为XML专用PI的名字。这个PI还有一段文本字符type=\。虽然看起来像是两个属性,但是这段内容却并不是这么处理的。在第6章和第7章中还会有更多样式表PI的例子。
3.注释
注释几乎可以出现在XML文档的任何地方。上面的XML文档例子中在序言里包含了一段注释,所以我们在了解其他序言内容时也看一看注释。
XML注释看起来与XHTML注释一样。它们以结束:
注释并不影响XML文档的处理,通常是为了便于阅读和理解的。在添加注释时需要遵循以下规则:
l 注释里不能包含文本-->; l 注释不能包含于标签内部;
l 元素中的开始标签或结束标签不能被注释掉;
l 虽然大多数XML处理程序都会把注释传递给应用程序,但并不一定必须这么做。
4.DTD和XML模式
DTD和XML模式提供关于XML文档内的元素和属性如何出现的规则。也就是说,它们确定哪些元素和属性是有效的,哪些是必需的或可选的。
序言中可以包含关于XML文档的声明,也可以包含一个到外部DTD或模式的引用,或是两者都包括。第2章将详细介绍DTD和模式。
1.3.4 XML文档元素中的段
XML文档中的数据存储在文档元素或根元素内。这个元素包含文档中的所有其他的元素、属性、文本和CDATA,同时也可包含实体和注释。
1.元素
在XML文档中,元素有很多作用,它们
l 可以标记内容;
l 为它们标记的内容提供一些描述; l 为数据的顺序和相对重要性提供信息; l 展示数据之间的关系。
元素包括一个开始标签、一个结束标签和内容。内容可以是文本、子元素或是二者都有。元素的开始标签中也可包含属性。在元素内部可以放置注释。
在前面的例子中,可以看到
开始标签
在前面说过,必须按照正确的顺序打开和关闭标签。下面的写法是错误的:
一共有四类元素:
l 空元素;
l 仅含文本的元素; l 仅含子元素的元素;
l 含子元素、文本或混合元素的元素。
第2章关于XML模式的内容将介绍区分这些不同类型的元素是多么重要。
q 空元素
如果元素中不包含任何文本,那么它就是个空元素,可以以两种方式书写。下列两段代码是完全相同的:
第二行的标签使用一种省略的写法,即在结束标签的尖括号前面加上一个正斜杠。XHTML中
标签也是空元素的一个例子。使用空元素写法可以减小文件的大小并使文档更清晰易读。
q 仅含文本的元素
有些元素仅含文本内容。从前面的例子中可以看到,
q 含其他元素的元素
一个元素可以仅包含其他的元素。容器元素称为父(parent),被包含的元素称为子(child)。
描述XML中的元素结构时经常使用族谱来作类比。
q 混合元素
混合元素既含有文本也含有子元素。上面DVD的例子并没有包含这种类型的元素。下面的代码片段显示了一个混合元素:
综上所述,元素有以下条件:
l 元素必须含有开始标签和结束标签。在没有内容的情况下,才可以使用省略写法; l 标签名称必须符合XML命名规则; l 元素必须正确地嵌套。
2.属性
在XML文档中,提供信息的另一种方法就是在元素的开始标签中使用属性。属性通常为它们所修饰的元素提供额外的信息。一个元素中可以出现的属性的数量是没有限制的。
属性由名称/值对组成,其中值是包含于单引号或双引号中的:
属性为元素提供额外的信息:
在这个例子中,数据Introduction to XML封装在
元素内部。此元素告诉Web浏览器另起一段显示信息。而style属性提供了如何显示数据的额外信息。这里是告诉浏览器将文本置中。
属性的两种通常用法是转换信息格式和指定特定的格式或编码。例如,可以这样转换日期格式:
或者指出使用国际标准化组织(ISO)的日期格式,如下所示:
当元素包含属性时,常称为复合类型(complex type)元素。后面将会看到,这在书写XML模式文档时是很重要的。
在同一个元素内,可以为不同的属性分别使用双引号或单引号,如:
请注意,不要在同一个属性中分别使用单引号和双引号,否则文档就不是合式的了。
注意 从文字处理文档中剪切属性粘贴到XML文档中时要十分小心。文字处理软件通常使用小引号,而这
会在XML文档中引起错误。
还可以将属性改写为嵌套的子元素。例如
可改写为:
关于哪种写法更好并没有一个明确的规则。两种写法都是可接受的。 现在总结一下与属性相关的规则:
l 属性由名称/值对组成;
l 属性值必须封装在单引号或双引号中; l 属性中不能含有XML标签; l 属性名称必须遵循XML命名规则。
3.文本
所有XML文档内部的文本都包含于开始标签和结束标签内部。除非该文本被标记为CDATA,那么它将会被认为是XML,从而做相应的处理。也就是说,左尖括号会被认为是某个XML标签的一部分。
如果希望在文本中使用保留的字符,那么必须将它们写为字符实体。例如,可以将左尖括号<写作<。保留字符也可以嵌入到CDATA中。
4.CDATA段
CDATA可以对文本块进行标记,这样它们就不会被当作XML进行处理。前面曾提到过,这对于包含XML保留字符的文本来说是非常有用的。
此CDATA段以
CDATA段可用于在XML文档中嵌入代码,如JavaScript代码,或者加入不需要处理的内容。例如,当一个应用程序从数据库里读取数据并且将它标记在XML文档中时,它可能将所有的内容都嵌入到CDATA段中,以避免对那些保留字一个一个地进行处理。第3章会介绍一个关于JavaScript的使用CDATA的例子。
5.实体
字符实体是表示单一字符的符号。在XHTML中,字符实体被用于表示一些特殊的符号,如与号&(&)和不间断空格( )。
在XML文档中,可以用字符实体替代保留字符。因为所有的标签都以左尖括号开始,所以在一个元素的文本中是无法包含这个字符的:
如果需要处理这个元素,文本25前面的左尖括号就会引起一个处理错误。这种情况下,应该以实体<来替代这个符号,如:
以下这些保留符号是需要注意的:
l <,表明一个标签的开始;
l &,表明一个实体的第一个字符; l xml,保留为用于对XML语言其他部分的引用,如xml-stylesheet。 表1-1总结了常用的字符实体。 表1-1 XML文档中使用的字符实体 字 符
& ' > < \
实 体 & ' > < "
有时一些字符是不能加入到XML文档中的,也许因为这些字符不在键盘上或者它是图形字符。在这种情况下,可以使用Unicode或十六进制数字将它们以字符实体的形式加入。比如,可以将版权符号?编码成©或©。
以开始并以分号结束的引用都是字符引用。中间的数字是所需字符的Unicode编码。如果编码写成十六进制形式,那么它的前面有一个x作为前缀。
实体也可以自己定义。比如,可以将Copyright 2006 Apress定义为©right;。每次需要在XML文档中包含这段文字时,都可以使用实体引用©right;。这使文本更容易管理和更新。
现在继续了解XML文档的处理。
1.4 XML的处理模型
XML推荐标准假设XML文档是以一种特定方式处理的。下面这个模型说明XML处理程序将XML文档的内容和结构都传递给应用程序。XML处理程序通常也称为XML解析器,因为它们对XML文档进行解析,如图1-2所示。
图1-2 XML文档处理模型
常见的XML处理程序有微软的XML Parser(MSXML)、Apache Xerces2和Oracle XML parser,可以在应用程序中使用任意一种。一些XML解析器也可以以软件包的形式自动安装。用于在Web浏览器中显示XML的XSLT(可扩展样式表语言转换)处理器就是这种类型。MSXML包含了XML解析器和XSLT处理器,它即是一个XML处理器也是一个应用程序。它随IE和其他微软的软件一起自动安装。
1.4.1 XML处理方式
XML有两种处理方式:基于树的和基于事件的。很多XML解析器,包括MSXML的最新版本,对两种模型都支持。基于树的解析器通常也称为DOM(文档对象模型)解析器,而基于事件的解析器通常被称为SAX(XML简单应用编程接口)解析器。二者都是以它们支持的规则命名的。
DOM是W3C推荐的XML文档应用编程接口(API)的标准。所有的应用程序都可以使用这个API来操作XML、读取信息、添加节点以及编辑当前的内容。关于这个推荐标准可以在http://www.w3.org/TR/REC-DOM-Level-1/中了解到更多内容。
SAX并不是W3C的推荐标准,但也得到了大大小小软件公司的支持。基于SAX的解析器顺序地读取XML文档,当它遇到文档中的重要部分时会触发事件,比如在元素的起始或结束位置。在http://www.saxproject.org/中可以了解到其更多内容。
1.4.2 DOM解析
图1-3表示的是前面所述dvd.xml文档的树型结构。
以这种方式显示文档进一步强调了在族谱中元素之间的关系。
图1-3 以树型结构显示的dvd.xml文档
DOM解析允许通过编程语言或是脚本语言(如JavaScript)访问这些元素以及它们的值,还可访问文档中的所有其他部分。
1.4.3 SAX解析
基于SAX的解析器以一串事件的形式展现XML文档。必须对每个事件编写处理程序,这样当事件触发处理程序时会产生相应的结果。
这种形式的解析对于有良好事件处理机制的语言非常适用。例如,SAX解析在Java中很常用。它对于网络上经常采用的脚本语言不太适用,因此这里就不详细讨论了。
1.4.4 为什么有两种处理模型
两种处理模型都有其优点。基于DOM的解析提供了对XML文档的完整的读写访问,并且可以通过遍历文档树对文档内的节点进行访问。它还可以对照DTD或XML模式来判断一个文档是否有效。
然而,基于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命名空间:
关于命名空间的最后一点是关于它们使用的属性。默认情况下,属性与它包含的元素属于同一个命名空间中。除非你使用的是不同于其包含元素的其他命名空间中定义的属性,否则就不必进行验证。
在关于如何使用DTD和XML模式定义XML词汇的内容中,将会进一步说明命名空间的重要性。
2.2 定义XML词汇
基于XML的语言通称为XML词汇,可以用DTD、XML模式或是其他模式语言对其加以定义。很多工业组织共同定义了他们自己的XML词汇。
如果需要使用XML词汇,就必须了解其构造规则。这些规则是产生符合语言构造标准的有效的XML文档的保证。
这些规则也使XML处理程序可以检查XML文档的一致性。这个过程称为有效性检查,进行这项工作的处理程序称为有效性解析器。第1章提供了一些如何处理XML文档的信息。
可以通过编写模式来共享XML词汇的规则。这是一个人或有效性处理器都可用的规范描述。如果只是在某个孤立的应用程序中使用XML文档,这种词汇的制定可能显得过分了。其真正的意义在于,当这个语言需要被其他人或应用程序共享时,每个用户都可以检查文档是否构造正确。
有两种常用的模式:DTD和XML模式。它们都由W3C定义并由他们控制。实际上,DTD本身就是XML推荐标准的一部分。
这里还是使用第1章中DVD库的例子:
首先看看如何建立一个DTD来描述这个词汇。
2.2.1 文档类型定义
DTD描述的是文档的结构,它指明一个元素可以出现多少次、它是否可选的以及它是否包含属性等等。
有效性解析器可以根据其DTD来检查一个XML文档是否有效。如果不是,解析器会报告一个错误。符合某个DTD的XML文档称为该DTD的一个文档实例。
本书并不是一部关于DTD的完整参考手册,但它包含了理解和构造DTD所需要的足够的信息。下面的DTD定义了DVD库文档:
这份文档被保存为dvd.dtd,可以在本书下载资源中找到。引用这个DTD的XML文档称为dvd_dtd.xml,其实叫什么名字并不重要。
这个DTD中演示了两种声明的类型,一种用于声明元素,另一种用于声明属性。其中还可以添加实体和符号的声明。但是符号声明并不常用,所以在稍后的“实体声明”部分中只对实体声明加以介绍。
1.元素类型声明
元素类型声明提供的是关于元素的信息。该声明以!ELEMENT文本开始并且列出元素名及其内容。内容可以是数据类型或是列在DTD中的其他元素:
空元素中显示的是EMPTY:
在下面的DTD例子中,
其中元素的顺序也指定了它们应该出现在XML文档实例中的位置。 解析字符数据(PCDATA)说明元素的内容是文本,并且XML解析器应该将此文本解析成字符和实体引用。
可以用一些修饰符来对子元素提供进一步说明。这些修饰符可参见表2-1。 表2-1 DTD中元素类型定义所用的符号 符 号
, + | () * ?
解 释
规定子元素的顺序
规定元素必须出现至少一次(一次或
多次)
允许从一组元素中选择一个元素 将内容标记成一个组
规定元素为可选,可以出现任意多次(零次或多次)
规定元素为可选,如果出现,只能有一次(零次或一次)
无符号表示元素必须出现一次
2.属性列表声明
属性声明出现在元素声明之后,它更复杂一些。可以通过添加属性列表声明表明元素中包含属性:
本行中,
注解 设置必须属性时并不会影响DTD中其他元素的声明。在该元素中包含子元素,而且也称为id,是完全
可以的。
最常用的属性类型为CDATA,但也可以声明为其他的类型:
l ID:一个唯一的识别符; l IDREF:另一个元素的ID ; l IDREFS:其他元素的一列ID; l NMTOKEN:一个有效的XML名字; l NMTOKENS:一列有效的XML名字; l ENTITY:一个实体名字; l ENTITIES:一列实体名字; l LIST:一列特定值。
关键字#REQUIRED表明此属性必须存在。也可以用#IMPLIED来表明一个可选属性。用#FIXED来表明此属性只能有一个值。如果XML没有包含这个属性,有效性解析器就会插入一个固定值。使用不是固定值的值会产生解析器错误。
如果需要指定属性可选的值,可以使用管道字符(|):
此行表明
3.实体声明
第1章中介绍了如何使用内建实体类型,也提到了可以自己定义实体以表示固定的数据。例如,可以将实体引用©right;指定为文本Copyright 2006 Apress。在DTD中可以这样定义这个实体:
这是个简单的内部实体声明。也可引用外部实体并用它将大量的内容包含在XML文档中。这与在XHTML文档中使用服务器端的包含文件比较类似。
下面的XML文档引用了几个实体:
这个文档从几个实体中取得它的内容,每个实体都代表一个外部XML文档。DTD需要为每个实体都添加一个声明。例如,可以将tableOfContenets实体定义如下:
4.将DTD关联到XML文档
目前已经介绍了如何构造DTD,但还没说明如何将之关联到XML文档。可以将DTD嵌入到XML文档内部,也可在文档中添加对外部DTD的引用。
对外部DTD的引用可以添加在XML文档的序言中:
也可将DTD直接嵌入到XML文档的序言中:
这个保存为dvd_embedded_dtd.xml的文件可以在资源文件中找到。 内部和外部DTD也可以同时使用。如果在元素和属性定义中有冲突发生,以内部DTD为准。
使用外部DTD的情况比较常见。这种方法可以用一个DTD文件来验证多个XML文档的有效性,也使DTD和文档实例更易于维护。
嵌入的DTD可以用来重载外部DTD。这与用嵌入的CSS声明来重载外部样式表非常类似。
如果应用DTD的文档是孤立的,使用嵌入的元素和属性声明会更加简单方便。即使不需要定义元素和属性,还是有可能需要定义实体的。
注解 如果包括一个对外部DTD的引用,且该DTD中含有实体定义,则必须将XML声明中的standalone
属性设置为no:
现在再来看看另一个更为常用的XML有效性判断语言——XML模式。
2.2.2 XML模式
XML模式与DTD有很多相似的地方。例如,两者都用于确定XML文档的结构。通过阅读http://www/w3.org/TR/xmlschema-0/上的W3C初级文档可以了解更多关于XML模式的内容。
DTD与XML模式也有很多不同。首先,XML模式语言是XML词汇的一种。XML模式比DTD功能更强,包含很多概念,如数据类型和继承等。然而,与DTD相比,
它们的构造也更为复杂。另一个缺点就是XML模式没有提供与DTD实体声明相同的功能。
关于XML模式的一个重要方面就是,在XML文档中,模式处理程序是一个个地验证元素的有效性的。这就使不同的元素可以依据不同的模式进行有效性验证,也使逐个地验证每个元素的有效性成为可能。如果文档中的每个元素根据适当的模式都被验证为有效的,则这个文档就是有效的。
这种元素级别的有效性验证有一个缺点,即XML模式并不提供确定文档元素的方法。因此,如果元素都是有效的,文档就是有效的,而不管其中是否包含了文档元素。
首先看看描述dvd.xml文档结构的模式:
直观看来,这个模式与此前的DTD有着很大的不同。最明显的区别就是,模式是基于标签的并且使用命名空间。由于是通过使用XML来创建模式词汇,因此可以利用一些标准的XML创建工具。XML模式也包含了一些适用于元素和属性的数据类型。例如,id属性使用的数据类型是xs:integer。
现在我们通览一遍这个模式文档。它以一个标准XML声明开始。文档元素称为schema,其中包含了一个到XML模式命名空间http://www.w3.org/2001/XMLSchema的引用:
按照惯例,这个命名空间通常用前缀xsd或xs进行关联。本例中用的是xs前缀。
这个模式中使用的是Russian Doll符号,其中元素的声明位于文档的相应位置。也就是说,元素声明的嵌入点也预示着元素的相对位置。将模式文档组织成其他形式也是可以的。
第一个定义的是文档元素
定义包括如下内容:
这些声明将元素定义为复合类型(complex type)元素,这就表示它会以某种顺序(
通过使用
如果元素恰恰只出现一次,就可以省略掉minOccurs和maxOccurs属性。
子元素是简单类型的,因为它们只包含有文本。如果它们包含属性,它们就会自动成为复合类型元素,但是此文档中唯一的属性包含于
通过指定名称和数据类型就可定义简单类型元素:
XML模式推荐标准中列出了44条内建的简单数据类型,包括string、integer、float、decimal、data、time、ID和Boolean。在http://www.w3.org/TR/xmlschema-2/中可以了解更多关于这些数据类型的内容。也可以自己定义复杂数据类型。
可以对属性值加上约束条件以限制元素的可能取值范围。 图2-1在Altova XMLSpy中并列地显示了XML文档和模式。
图2-1 XML文档及其相关模式
1.可选的布局
在上个例子中,只有
下面的代码是经过重写的模式文档,它使
可以在资源文件中找到保存为dvd_global.xsd的文档。
重写的模式文档变化不大。整个
图2-2 XML文档及其可选的相关模式
当同一个元素出现在多个地方时,创建这种模式文档的结构就很有用了。XML模式中没有文档实例中文档元素的概念,因此可以包含多个全局元素。不利之处是,有效性解析器可以接受任意一个元素作为文档元素。
2.定义数据类型
上面的XML模式样本只使用了XML模式推荐标准中的内建简单数据类型。也可以自己定义数据类型。例如,如果一个属性只能有yes或no值,那么自定义一个反映这种情况的数据类型或许有用:
上述声明创建了一个名为YesNoType的简单类型元素。该元素基于xs:string数据类型并且有两个可选值:yes或no。
一旦定义后,声明就可以使用内建数据类型同样的方式使用这个数据类型:
如果需要将这个数据类型用于其他的模式,那么可以像在网站中使用服务器端包含文件那样包含样式。数据类型可以保存在一个模式文档中,并使用
这个数据类型定义被保存于customDataType.xsd文件中。在模式文档中,可以使用下列声明来对它进行引用:
customDataType.xsd和dvd_include.xsd文件可以在下载的资源文件中找到。
注解 引入的模式有时称为架构型模式,因为它的目的是提供作为文档有效性验证依据的文档模式的构造单
元。 3.模式结构
前面介绍了创建模式的三种不同方法:在一个元素中声明所有的元素和属性(Russian doll),使用ref数据类型定义全局元素,以及定义自命名的数据类型。
总地来说,如果只针对某个文档定义模式,Russian doll方法比较合适。如果创建的模式可能用于几个不同的文档实例,那么至少为其中的某些元素使用全局定义将会比较灵活方便。
如果希望某个元素总是以同样的名字被引用,那就将它定义为一个元素。如果不同名字的元素有可能具有相同的结构时,就定义一个数据类型。
举个例子,如果有个文档包含一个可能具有多种用途的地址,例如邮政地址、街道地址和投递地址。一种方法可能是在整个文档中重用元素。然而,如果希望同样的元素结构具有不同的元素名称,那么定义一个全局性的address数据类型会更好,它可以用于
4.模式和命名空间
XML模式的主题非常丰富,可以用一整本书来进行讨论。但现在我们只讨论模式与命名空间的关系。
定义一个模式时,可能也会定义一个其实例文档所在的命名空间。可以通过使用
模式内对这些元素的引用都必须使用这个命名空间。这可避免将之定义为XML模式的默认命名空间所带来的麻烦。下面是一个例子:
在这个例子中,elementFormDefault属性设置成了qualified,还将attributeFormDefault属性设置为unqualified。这些属性说明了本地定义的元素和属性是否在命名空间内有效。本地定义的元素是指在复合类型元素中定义的元素。
将elementFormDefault属性设置为qualified并不意味着文档实例中的本地元素也是有效的。attributeFormDefault的设置确保属性被当成属于其包含元素所有的命名空间里的属性一样对待。这在XML中是默认的。
5.将模式指定到文档
在建立了模式文档后,需要从实例文档中对其加以引用,这样XML有效性解析器就可对文档进行有效性验证。这可以通过schemaLocation或noNamespaceSchemaLocation属性来指定。如果没有目标命名空间,就使用后一个属性。
这些属性是W3C控制的命名空间的一部分,被称为XML模式实例命名空间。通常以前缀xsi进行引用。这需要在文档实例内部对命名空间进行声明。
由于模式文档不在命名空间内部,因此使用noNamespaceSchemaLocation属性作为文档元素的例子:
完整的文档保存为dvd_schema.xml,可以在下载的文件中找到。
注意xsi:noNamespaceSchemaLocation属性的语法。在本例中,该文档使用了一个对模式文档的本地引用,但它本可使用一个有效的URI来从互联网上寻找到模式文档。
如果使用了schemaLocation属性,那么其值将由一个命名空间URI加上该命名空间的XML模式文档的物理位置的URI组成。可以对文档元素进行重写使其引用一个命名空间:
如上例所示,使用本地引用或是有效的URI都是可以的。值得注意的是,属性xsi:schemaLocation的值可以是任意数量的URI对,其第一部分是命名空间的URI,而第二部分是相关XML模式的位置。这使得一个文档实例可以被关联到多个XML模式文档。
6.模式和实体声明
DTD的一个优点在于,它们可提供一种定义个性化的实体引用的方法。如前所述,这在使用XML模式来声明XML词汇时是不行的。在使用XML模式时,如需要包括实体引用,那么也可以在文档实例中包含一个DTD。XML模式用于有效性验证,而DTD则用于声明实体引用:
2.2.3 DTD与模式的比较
前面已经介绍了DTD和XML模式是如何确定XML词汇的规则的。虽然这两种类型的文档都起着相同的作用,但它们之间还是有一些不同。下面对它们做一个比较:
l DTD和XML模式都可对XML文档的结构进行定义,以便通过一个有效性解析器来对文档进行检查; l DTD中可以定义实体,而在XML模式中却不行; l XML模式中可以为字符数据指定数据类型,而DTD不行; l XML模式中可以定义个性化的数据类型,而DTD却不能;
l XML模式支持从一个数据类型中引申另一个数据类型,而DTD却不支持数据类型的引申; l XML模式支持命名空间,而DTD却不支持命名空间;
l XML模式提供
l XML模式使用XML标记语法,因而可以使用标准XML处理工具创建和修改它们而DTD并不遵循XML词汇的构造规则;
l 由于DTD的语法简练,因而其文档较小。XML模式的语法通常不够简练,因而产生的文件较大; l XML模式语言比DTD规范更新,它弥补了DTD的一些不足之处。
DTD和XML模式是很多模式语言中的两种。在某些情况下,也许需要考虑使用其他类型的模式。
2.2.4 其他模式类型
DTD和XML模式都属于封闭模式语言。也就是说,它们禁止所有模式中没有明确允许的东西。XML模式语言提供了一些扩展性,但它基本上还是属于封闭语言。
其他一些模式语言是开放的,它们允许出现模式没有明确禁止的内容。这些语言可以用于替代DTD和XML模式,也可以作为它们的补充。对它们的处理是在对封闭语言处理后进行的。
如果需要构造一个约束规则,而它在DTD或XML模式中却是无法实现的,可能就需要使用另一种模式类型。例如,某税务系统可能会有如下规则:“如果性别值为男性,就不能存在产科费用这个元素。”应用程序中经常会存在这样的业务规则,另一种不同的模式类型可能更容易描述这样的约束。
这些可选的模式语言包括:
l Schematron:http://www.ascc.net/xml/resource/schematron/schematron.html;
l REgular LAnguage for XML Next Generation(RELAX NG):http://www.oasis-open.org/ committees/tc_home.php?wg_abbrev=relax-ng;
l XML-Data Reduced(XDR):http://www.ltg.ed.ac.uk/~ht/XMLData-Reduced.htm。
Schematron使用XSLT和XPath,因而可以将Schematron声明嵌入到XML模式文件内部以扩展它的应用范围。本章的“理解XSLT”和“XPath”部分将会对XSLT和XPath做更多的介绍。
目前使用的XML词汇还有很多种,下一节会介绍几种常用的词汇。
正在阅读:
XML语法大全06-18
环氧地坪施工前准备工作几大要素07-12
微信代运营的服务内容12-29
吃货的故事作文800字06-17
给我一片绿作文800字06-17
东北育才高中部第八次模拟考试理科综合试题06-24
城管局在创建文明城市工作会上的表态发言04-15
护理研究 复习资料11-09
家乡巨变02-13
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 语法
- 大全
- XML
- 毕业论文 论民营企业绩效管理研究9页
- 高考语文常见错句解析
- 税法宣传活动策划书 - 图文
- 小城镇综合提升规划文本01.25
- 高校档案馆数字资源管理与存储优化策略研究
- 刮板输送机司机风险管理标准及管理措施
- 铁路安全管理条例
- 四年级上册英语句子朗读(带翻译)(自动保存的)
- 模电课程设计
- 广场舞大赛策划方案
- 我国农业标准化发展现状及政策环境分析
- 高中化学重要知识点详细总结
- 《十二次微笑》说课
- 工程总包对分包商的管理方案-secret
- 特殊工种标准目录严重老化提前退休难操作
- 人教版小学语文四年级上册第三单元《10.幸福是什么》同步练习
- 安卓系统提升ROM可用空间的方法
- 新课程理念下政治课堂教学方法及策略初探1
- 45中学生物竞赛辅导第四章:无脊椎动物(下)
- 思念被指回收次品蛋挞加工 员工毛巾擦手算消毒