1、第第2 2章章 XMLXML基础语法基础语法2.1 XML文档结构2.2 XML声明2.3 XML标记与元素2.4 XML命名空间2.5 预定义实体与CDATA节2.6 处理指令与注释2.7 内部实体引用初探2.8 格式良好与有效的XML文档2.9 综合实例2.10 本章小结习题 2.1 XML文档结构XML首先体现的是简单性。这种简单性不只体现在XML文档是纯文本,更体现在XML的语法规则十分精简。相对于HTML中的几百个预定义标记和属性而言,XML几乎没有预先定义好的标记和属性。其次,XML语法体现的是严格性。XML文档必须遵守语法规则,在XML文档中的任何差错都会得到同一个结果:XML文
2、档不能处理或网页不能被显示。各浏览器开发商已经达成协议,对XML实行严格而挑剔的解析,任何细小的错误都会被报告。下面这个实例包含了XML文档最基本的组成。【例2-1】案例说明:一个简单的XML文档。程序名称:ch2-1.xml01 02 03 04 7-5606-0924-4/TP085105 软件工程06 介绍软件工程理论.07 邓良松08 计算机09 西安电子科技大学出版社10 2001年6月11 20.0012 13 14 7-5606-0492-7/TP022915 软件系统开发技术(修订版)16 介绍软件系统的开发技术.17 潘锦平18 计算机19 西安电子科技大学出版社20 200
3、1年1月21 12.3022 23 案例分析:一个XML文档最基本的构成包括XML声明和XML元素。例2-1中出现的结构要素如下:第01行是XML声明,第0223行是定义的各个元素。这个XML实例文档描述了关于软件开发的两本图书信息,包括图书的ISBN号()、图书名()、图书摘要()、作者()、分类()、出版社()、出版日期()、价格()。从文档代码的格式缩进可以看出该文档的结构化描述。2.2 XML声明XML中规定,XML声明(XML Declaration)必须是XML文档中的第一个内容,每个文档都必须以XML声明开头,前面不允许有任何空白或注释。W3C推荐标准提出了大小写敏感的要求,并将
4、声明中的“xml”规定为小写,而且与大多数XML属性不同,这些必须按下面描述的顺序依次出现。XML声明是处理指令(Processing Instruction,PI),处理指令将在2.6节详细说明。例2-1中的声明代表了一个XML声明的完整语法:这些属性已经在XML 1.0规范中做出了定义:(1)像所有的处理指令一样,XML声明也是由“”结束。(2)“?”之后的“xml”表示该文件是一个XML文件。(3)version不能省略,其值必须为“1.0”。该属性用来保证对XML未来版本的支持。(4)encoding可选,其值必须是一种合法的字符编码,例如“UTF-8”、“UTF-16”或“ISO-8
5、859-1”(即Latin-1字符编码)。所有XML解析器都要求至少支持“UTF-8”或“UTF-16”。如果没有包含这个属性,就假设是“UTF-8”或“UTF-16”编码,这取决于开始的“?xml”字符串的格式。采用哪种编码取决于文档中用到的字符集。下面是几个常见的编码:(1)简体中文码:GB2312。(2)繁体中文码:BIG5。(3)压缩的Unicode编码:UTF-8。(4)压缩的UCS编码:UTF-16。(5)standalone可选,其值必须是“yes”或“no”。如果是“yes”,就意味着所有必需的实体声明都包含在文档中;如果是“no”,就意味着需要外部的DTD。(参见第3章关于D
6、TD的部分。)声明与标记一样,都不属于文档的内容,都是根据XML规范添加进文档的附加信息。但标记用于标注文档的内容,声明则提供了控制文档使用的必要信息。2.3 XML标记与元素元素是XML文档的基本单元,其中可以包含其他的元素、字符数据、字符引用、实体引用、PI、注释以及CDATA节,它们合在一起被称做元素内容(element content),相当于一个盛放文档内容的容器。在XML文档中,所有的“内容”都必须被各种各样大大小小的容器封装起来,然后在容器上标示出对承载内容进行说明的标记,所有的XML数据(除了根元素、注释、PI和空白)都必须包容在其他元素中。一个元素包含一个起始标记、一个结束标
7、记及标记之间的数据内容,格式如下:数据内容元素使用标记(tag)进行分隔,由一对尖括号(“”)围住元素类型名(一个字符串)。每一个元素都必须由一个起始标记和一个结束标记分隔开,这与要求比较宽松的HTML文档不同,后者的结束标记可以省略。2.3.1 标记的组成1起始标记一个元素开始的分隔符被称做起始标记。起始标记是一个包含在尖括号里的标记名。也可以把起始标记看做是“打开”了一个元素,就像我们打开一个文件或通信链路一样。2结束标记一个元素最后的分隔符被称做结束标记。结束标记由一个反斜杠和标记名组成,被围在一对尖括号中。每一个结束标记都必须与一个起始标记相匹配,关闭标记的名称与打开标记的名称必须相同
8、。我们可以把结束标记理解为关闭了一个由起始标记打开的元素。下面是两个合法的起始和结束标记:contentcontent由于XML是大小写敏感的,因此上述两个例子不是等同的标记。下面是两个合法的起始和结束标记:contentcontent标记内的名称可以使用任何合法字母,而不一定是ASCII码字符,所以上述两个标记中一个使用了含义相同的中文编码。标记是编写XML文档必须用到的。在HTML文档中所使用的标记都是已经定义好的,有各自固定的格式。而在XML中几乎没有固定的标记,可以按照自己的需要来定义和使用标记,标记将语义和内容分离开来。2.3.2 标记命名规则 标记的名称必须符合以下规则:(1)英文
9、名称必须以英文字母或者下划线“_”开头,中文名称必须以中文文字或者下划线“_”开头。(2)在使用默认编码集的情况下,名称可以由英文字母、数字、下划线“_”、连接符“-”和点号“.”构成。在指定了编码集的情况下,名称中除上述字符外,还可以出现该字符集中的合法字符。(3)名称中不能含有空格。(4)名称中含有英文字母时,对大小写是敏感的。2.3.3 非空标记与空标记XML元素由XML标记来定义。XML标记有两种:非空标记与空标记。相应的,XML元素也就有非空元素与空元素之分。1非空标记与非空元素非空标记由开始标记和结束标记组成。对于XML文档,起始标记和结束标记有着非常重要的作用,它们将文档的数据进
10、行结构化组织,并确定元素的范围和相互关系。非空元素由非空标记来定义,其一般表示形式如下:元素内容非空标记必须是对称性标记,起始标记和结束标记同名。在XML文档中,起始标记和结束标记之间一定要有其他内容、字符数据或其他标记,其中的元素内容有时也称为数据信息,它可以是文本,如例2-1中的“软件工程”,也可以是子元素,如例2-1中的标记中嵌套的子元素。7-5606-0924-4/TP0851 软件工程 介绍软件工程理论.邓良松 计算机 西安电子科技大学出版社 2001年6月 20.002空标记与空元素如果对称性标记间无任何内容,既无字符数据,又无其他标记,则该标记称为“空标记”。空标记可以用两个对称
11、的标记来表示,如“”,注意这对标记中无任何内容。空标记一般表示为一个单独的标记,在标记名和定界符之间加入一个“/”符号,也就是空标记“”,也可以表示为“”。空标记一般都具有属性,属性将在2.3.5节中进行说明。2.3.4 根元素格式正规的XML文档的定义形式是一个简单的层次树,每个文档都有一个,而且只有一个根节点,它被称做文档实体(document entity)或文档根(document root)。这个节点可能包含PI或注释,而且总是包含子元素树,它们的根被称做文档元素(document element),这个元素是这个树中其他所有元素的父元素,而且它可能不包含在其他任何元素当中。由于文档
12、根和文档元素并不是一回事,因此最好不要把文档元素看做是“根元素”(即使它是子元素树的根)。如例2-1中的“BookList”元素,该元素包含了文档中的所有元素。2.3.5 元素的属性在例2-1中,所有的数据都分为标记名和元素的内容两类,这种表示数据的方法简单易懂,但不是唯一的。XML元素与HTML元素一样,可以用属性来表达数据。元素可以有多个属性,但每个属性都是由一个“名称数值”对组成,名称和数值分别为一个字符串,同一个元素不能有两个同名的属性。例如我们表达一个矩形时,它的长和宽就成为了矩形的属性,如,这里还采用了空标记的表示方法。属性名是字符串,遵循与标记名同样的规则。也就是说,属性名必须以
13、字母或下划线“_”开始,名称中后续字符可以包含字母、数字、下划线、连字符和句号,其中不能含有空格(经常用下划线替代空格)。例2-2将例2-1中原本是子元素的元素,改成了元素的一个属性。【例2-2】案例说明:演示元素属性的XML文档。程序名称:ch2-2.xml0102 03 04 软件工程05 介绍软件工程理论.06 邓良松07 计算机 08 西安电子科技大学出版社09 2001年6月10 20.0011 12 13 软件系统开发技术(修订版)14 介绍软件系统的开发技术.15 潘锦平16 计算机17 西安电子科技大学出版社18 2001年1月19 12.3020 21 何时使用子元素及何时使
14、用属性并没有严格的规范可以遵循。一个好的经验规则是数据本身应当存储在元素中,而有关数据的信息(元数据)应当存储在属性中;不知道怎么做时,就把信息放在元素中。为区分数据与元数据,首先要在设计XML文档时考虑是否会有一些读者希望看到一条特别的信息。如果答案是肯定的,该信息应当包含在一个子元素中;相反,则应包含在一个属性中。如果从该文档中删除所有标记与属性,文档的基本信息应当还存在。属性是放置ID号、URL、参考资料及其他与读者不直接相关的信息的好地方,但是,把元数据作为属性存储的基本规则还有许多例外,这些例外包括:属性不能很好地保持原文的结构;元素允许包括元元数据(有关信息的更深层次的信息);每个
15、人对元数据和非元数据的理解是不一样的;面对以后的变化,元素更具扩展性。2.3.6 元素的嵌套XML文档通过标记的正确嵌套来形成一个元素嵌套的层次数,这种元素嵌套就好像学校嵌套了许多专业,每个专业嵌套了许多班级,每个班级嵌套了很多学生,每个学生又嵌套了诸如姓名、年龄、籍贯等表达个人信息的元素。下面即是说明一个元素嵌套的例子,在该例子中根元素是,又嵌套了两本,每本又嵌套了诸多书籍出版信息的元素,其中表达作者信息的又嵌套了和两个元素。【例2-3】案例说明:一个多级嵌套的XML文档。程序名称:ch2-3.xml0102 03 04 7-5606-0924-4/TP085105 软件工程06 介绍软件工
16、程理论.07 08 邓良松09 男 10 11 计算机12 西安电子科技大学出版社13 2001年6月14 20.0015 16 17 7-5606-0492-7/TP022918 软件系统开发技术(修订版)19 介绍软件系统的开发技术.20 21 潘锦平22 男 23 24 计算机25 西安电子科技大学出版社26 2001年1月27 12.3028 29 例2-3所表达的元素嵌套层次树如图2-1所示。图2-1 元素嵌套层次树2.4 XML命名空间命名空间的本质是保持名称唯一性的一种手段,网络技术中的域名系统(Domain Name System,DNS)中便是一种实现全球名称唯一性的重要技术
17、。如果有两台邮件服务器名称都叫mailServer,但是分处于两个不同的公司或者机构,要想在互联网上找到它们就必须使用域名系统。域名系统通过层次化命名的方式解决这个可能会出现的重名问题,例如mailServer.CompanyO和mailServer.CompanyT就很清楚地表明了每个邮件服务器所属的公司,而且不会重名。因为自右向左的每一个点都可以理解为层次化命名系统中的一个层次(一个命名空间),在相同的层次中不重名就能保证在整个互联网范围内不会重名,并且每层都可以有相应的命名管理机构,避免了使用mailServerCompanyOneCom、mailServerCompanyTwoCom这
18、种加长名称保持唯一性的方法。XML文档标记的自解释性将标记的命名完全交给了使用者,其中必然会出现重名的标记,为了避免同名标记的二义性,XML也引入了命名空间的概念。2.4.1 命名空间的声明形式XML命名空间将XML文档中的元素和属性名称与自定义和预定义的URI关联起来。为命名空间用URI定义的前缀用来限定XML数据中的元素和属性的名称以实现此关联。命名空间可防止元素和属性名称冲突,并允许以不同的方式处理和验证同名的元素和属性。在XML中定义命名空间的语法为:命名空间是使用xmlns:属性在元素上声明的,而且这个属性的值就是标识该命名空间的统一资源标志符(Uniform Resource Id
19、entifier,URI)或者统一资源名称(Uniform Resource Name,URN。它是URI的子集)。其中是说明命名空间URI的字符串,“name”是命名空间前缀的名称。一旦声明后,前缀就可以用来限定XML文档中的元素和属性并将它们与命名空间URI关联。因为命名空间前缀在整个文档中使用,所以它的长度应较短。下面便是两个定义命名空间的例子:上面两行分别定义了两个BOOK元素,这两个BOOK元素不完全相同,因为每个元素分别与不同的命名空间关联。第一个BOOK元素由命名空间前缀myBooks限定,而第二个BOOK元素由前缀yourBooks限定。通过对每个BOOK元素使用命名空间声明,
20、每个命名空间前缀都与不同的命名空间URI关联。若要声明并使用默认命名空间,可以从元素的声明中省略别名和分号,如BOOK元素以来定义的命名空间。任何没有用命名空间前缀完全限定的元素均属于默认命名空间。当在XML文档中使用多个命名空间时,将其中一个命名空间定义为默认命名空间可以使文档更加简洁。只有来自非默认命名空间的元素需要完全限定。默认命名空间只适用于元素,不适用于属性。2.4.2 命名空间的作用范围命名空间声明是有作用范围的,虽然命名空间可以出现在文档中的任何位置,但像编程变量一样有作用范围,命名空间只在相应的范围内有效。有两种作用范围:(1)默认命名空间:在根元素中声明的命名空间。它应用于文
21、档中所有未限定的元素。(2)限定命名空间:在一个更具体的命名空间处于文档中某一位置重写时所声明的命名空间。尽管命名空间必须声明后才能使用,但这并不意味着它必须出现在XML文档的开头。例如,下面的示例显示一个在数据中间声明的限定命名空间,它是在MyBookRelated元素级别声明的,该命名空间只应用于该元素的子元素。【例2-4】案例说明:具有两个命名空间作用范围的XML文档。程序名称:ch2-4.xml01 02 03 04 05 软件工程06 邓良松07 男 08 西安电子科技大学出版社09 20.0010 11 12 7-5606-0492-7/TP0229 13 软件系统开发技术(修定版
22、)14 潘锦平15 男16 西安电子科技大学出版17 12.30 18 19 20 7-5606-0492-7/TP022921 程序设计与C语言22 梁力23 男24 西安交大出版社25 26.0026 27 28 29 案例分析:(1)例2-4中的第03行代码“”定义了作用于整个文档的默认命名空间。2)在第10行的代码“”定义了一个出现在XML文档中的命名空间,当命名空间在文档中出现时,意味着所声明的命名空间从它的声明位置直到元素的结尾(命名空间的声明范围)都有效。在本例中意味着“MyBooksRelated”命名空间的作用范围是从第10行代码一直到该元素的末尾第27行代码“”。(3)也可
23、以在第03行代码中直接定义“MyBookRelated”命名空间,两个命名空间的定义采用一个空格隔开,如下面所示定义:如果已为MyBookRelated元素声明了命名空间,则使用该命名空间的元素需要通过一个冒号将该命名空间添加到元素之前,以完全限定元素。如果XML文档采用开始就定义命名空间的方法,为了保持和例2-4中的命名空间作用范围一致,那么其中的第10行至第27行的元素及子元素标签都要加上“MyBookRelated:”,第10行的元素开始标签将声明为“”,第27行的元素结束标签将声明为“”。2.5 预定义实体与CDATA节XML为显示非ASCII码字符集中的字符提供了两种方法:字符引用和
24、实体引用。在XML中,字符引用是一个字符文字形式的替代品,当对该字符的文字形式直接处理会导致违反XML对格式正规的要求时,它会起到非常重要的作用。字符引用用来表示一个可显示的字符,它由十进制或十六进制的数字前面加上“”或“”,后面紧跟分号“;”组成。例如,“©”或“©”(在浏览器中)会被显示为“”,而“®”或“®”会被显示为“”。实体引用允许在元素内容或属性值中插入任何字符串,这就为字符引用提供了一种助记的替代方式。实体引用是一种合法的XML名字,前面带有一个符号“&”,后面跟着一个分号“;”,格式如“&name;”。有五个实体被定义为XML的
25、固有部分,它们通常用作XML标记分隔符号的转义序列,如表2-1所示。除了上述五个实体,所有实体都必须在文档使用前予以定义(就像传统编程中宏的定义和使用一样)。实体在文档的DTD中定义,DTD可以是一个被称做“外部子集”的文档外的独立对象(详见第3章),也可以是一个在文档本身中使用声明的“内部子集”(参见2.7节“内部实体引用初探”部分)。例如,AT&T在支持XML的浏览器中会显示为AT&T,"Jack'sTracks"则显示为“JacksTracks”。CDATA节是一种用来包含文本的方法,其对象是那些其中的字符如果不包含在CDATA节中就会被识别为标记的
26、文本,例如表2-1中的“”、“&”等五个符号。这项特性对于希望在自己的文档中包含大量XML标记的使用者来说是最有用的,就像本书中的各个案例作为XML的数据信息进行存储时需要大量的预定义实体引用,此时就应该使用CDATA节。在CDATA段中所有文本都是纯字符数据。看起来与标记或者实体相似的仅仅是它们各自相应的文本。XML处理器无论如何是不会解释它们的。如果有这样一个元素,标记为,数据内容为“西安电子科技大学出版社”,则在XML中可以有两种表达方式:采用预定义实体引用的表达方式:<Publisher>西安电子科技大学出版社</Publisher>采用CDATA节的表达方式:
27、!CDATA西安电子科技大学出版社第二种方法明显要易于读写一些,而且还有一个额外的好处,就是允许在任何地方都可以直接剪切粘贴XML代码。第一种方法仅仅是用正确的实体引用来代替两个标记字符,这样在解析时它们就不会被错误地解释为元素标记。2.6 处理指令与注释处理指令(Processing Instruction,PI)将XML处理的信息传递给应用程序,如例1-2中程序ch1-2.xml 中XML声明之后的。PI使用的是XML元素语法的一种变形:其中,target是必需的部分,而且必须是有效的XML名称,它用来指明哪个应用程序(或者其他对象)需要PI的帮助,.instruction.部分只不过是一
28、个字符串表示,它可能包含任何有效的字符,除了“?”(因为这是PI的结束符)。另一个几乎随处可见的PI的用途就是将一个样式单和XML数据对象关联起来:注释(comment)是在XML文档中插入提示,如在例2-4中的02行代码“”。这些注释可能提供修订记录、历史信息或者其他类型的可能对创建者或者文档编辑者来说有着特殊意义但又不是真正的文档内容的元数据。注释可能出现在文档中XML声明之后的任何地方。注释格式:注释应注意的问题:注释不能出现在XML声明之前;注释不能出现在标记中;注释中不能出现连续两个连字符,即“-”,如;注释中可包含元素,但元素中不能包含“-”;注释不能嵌套。2.7 内部实体引用初探
29、在编写应用程序代码时,很多代码提供的数学计算功能如sin、cos、求数值数组的最小值等代码片段经常被使用,而且一旦算法进行更改或者优化就要在所有应用代码片段的地方进行更改。对此种情况常见的做法是将这些代码片段写成函数,通过函数名和参数进行代码的重用,如果代码要进行更改只需要更改定义函数的代码就可以了。这种做法大大减少了代码数量和代码维护量。XML同样提供了声明内容块的方法,可以根据需要多次引用这些内容块,它不仅能够节省空间,而且能够减少文档创作者的代码输入量。为了在 DTD(在第3章将详细说明)中声明实体,需要定义实体的名称及它引用的内容。当需要使用它时,可采用特殊的语法通过名称进行引用,这种
30、特殊的语法能够说明所提供的名称是实体引用。除了本章讲述过的预定义实体引用,还有一种实体引用称为通用实体引用。通用实体是最简单的实体形式,它能够声明与某个名称相关联的可解析的文本块,我们将通过该名称引用相应的文本。这类实体声明包含关键字ENTITY、实体名称和替换值。定义通用实体的语法格式为:下面的XML文档案例说明了如何定义通用实体以及在XML文档中是如何引用内部实体的。【例2-5】案例说明:出版社和地址信息采用内部通用实体引用的XML文档。程序名称:ch2-5.xml01 02 03!DOCTYPE BookList04 05 06 07 08 09 软件工程10 邓良松11&Publish
31、er;12 20.0013&PubAddress;14 15 16 软件系统开发技术(修订版)17 介绍软件系统的开发技术.18 潘锦平19 计算机20&Publisher;21 12.3022&PubAddress;23 24 案例分析:XML文档中第04行和第05行代码定义了两个通用实体名PubAddress和Publisher。这两个实体名称分别代表了后面双引号中定义的内容块。XML文档中的第11行和第20行代码对通用实体“Publisher”进行了引用,第13行和第22行代码对通用实体“PubAddress”进行了引用。从引用的代码段我们可以得出内部实体引用的格式为:&实体名;图2-2
32、所示为例2-5在浏览器中的显示结果,该结果将与通用实体名称对应的内容块显示了出来。图2-2 例2-5在浏览器中的显示结果2.8 格式良好与有效的XML文档“格式良好的”是对XML文档最基本的要求。凡是“格式良好的”XML文档都可以被XML解析器解析,进而生成对象树,以便接受进一步的处理。XML文档必须严格遵守语法规范,即都必须是“格式良好的”。要保证编写的XML文档是“格式良好的”,必须遵守以下XML的基本规则:(1)文档的开始必须是XML声明。(2)含有数据的元素必须有起始标记和结束标记。(3)不含数据并且仅使用一个标记的元素必须以“/”结束。(4)文档只能包含一个能够包含全部其他元素的元素
33、,即根元素。(5)元素只能嵌套不能重叠。(6)属性值必须加引号。(7)字符“”和“&”只能用于起始标记和实体引用。(8)文档中正确地使用实体引用。同时,XML文档还应当符合语义方面的规范,即是“有效的”。对XML文档有效性的检查称为对XML的“验证”(Validation)。“有效的”XML必定是“格式良好的”,在此基础上,还要遵守DTD(详见第3章)或XML Schema(详见第4章)的语法规定,只有这样才能保证XML文档的易读性,同时还能充分体现数据信息之间的关系,从而更好地描述数据。2.9 综 合 实 例【例2-6】案例说明:综合运用本章知识的一个实例。程序名称:ch2-6.xml010
34、203!DOCTYPE BookList04 05 06 07 08 09 软件工程10 邓良松11 男12&Publisher;13 20.00 14&PubAddress;15 16 17 7-5606-0492-7/TP022918 软件系统开发技术(修订版)19 潘锦平20 男 21&Publisher;22 12.30 23 本书价格<20元 24&PubAddress;25 26 27 7-5606-0492-7/TP0229 28 程序设计与C语言29 梁力 30 男 31 西安交大出版社 32 26.00 33 20元 34 西安市兴庆南路10号35 36 37 38 图2-3 例2-6在浏览器中的显示结果2.10 本 章 小 结本章讲述了XML的基本语法,首先通过一个简单的XML案例介绍了XML文档的基本结构,接下来详细介绍了XML文档的语法规范,主要包括:XML文档的基本组成、XML声明、XML的标记与元素、元素的属性以及元素的嵌套、XML元素的命名空间、预定义实体的引用、CDATA节、处理指令与注释、通用实体的定义和内部引用、格式良好和有效的XML文档。习题21.请画出2.9节例2-6中由元素构成的树型结构草图。2.请设计出表达学校、院系、班级、学生的XML元素信息,并画出设计的元素组成的树型结构草图。