IBM认证 百分网手机站

XML认证元素类型声明

时间:2017-12-18 09:49:34 IBM认证 我要投稿

XML认证元素类型声明

  一个Dtd不仅要告诉语法分析器它所关联的XML文件的根元素是什么,而且还要告诉语法分析器文件的内容和结构,说清文件结构中的每一个细节。为了定义这些细节,我们必须展开Dtd中元素说明部分,使用元素类型声明(Etd)来声明所有有效的文件元素。

  Etd不但说明了每个文件中可能存在的元素,给出了元素的名字,而且给出了元素的具体类型。一个XML元素可以为空,也可以是一段纯文本,还可以有若干个子元素,而这些子元素同时又可以有它们的子元素。Dtd正是通过元素之间的父子关系,描述了整个文件的结构关系。

  Etd应该采用如下的结构:

  因此,在前面的例子里,可以在文件序言中通过如下方式定义“联系人列表”这个元素:

  ]>

  <联系人列表>

  ...

  这个Dtd定义了一个XML文件,它只有一个根元素,名为“联系人列表”,这个元素可以有任何类型的子元素,也可以是纯文本,还可以为空。

  但是需要注意,尽管元素“联系人列表”被定义为“可以”包含其它元素,但实际上这个 Dtd除了“联系人列表”元素本身外没有定义任何其它元素,所以也就没有其它元素可以用作“联系人列表”的子元素。“有效的”XML文件规定文件中所使用的任何元素都必须在Dtd中给出定义。

  在“ANY”定义下使用任何纯文本都是无须另加说明的,这一点与元素不同。故而,在相同的Dtd定义下,下面一段XML文件则是合法的:

  ]>

  <联系人列表>

  纯文本信息说明联系人信息

  元素类型声明2

  为了使元素“联系人列表”中还可以包含其它元素,从而使前面的那个文件是“有效 的”,我们还需要定义元素“联系人”和“姓名”。

  ]>

  <联系人列表>

  <联系人>

  <姓名>张三

  现在我们已经定义了一个XML文件,它的根元素名为“联系人列表”。“联系人列表” 中可以包含任何纯文本数据,也可以含有子元素(这即是ANY的含义)。根据后面的定义,我们知道,“联系人列表”中可以包含子元素“联系人”,也可以直接包含子元素“姓名”;“联系人”元素又可以包含自己的子元素,名为“姓名”;而“姓名”则只能包含纯文本数据(即(#PCDATA))。

  注意:

  除了根元素外,在定义其它元素时使用关键字ANY都是不好的习惯。

  在定义元素时,Etd的顺序是无关紧要的。

  还有一点要注意,不能对不同的元素使用相同的元素名,即便这些元素的内容、包含的子元素不同也不行,因为它只会引起文件各个元素的混淆,使文件的可读性大打折扣。

  元素名的第一个字母必须是字母、或下划线(_)、或冒号(:),后跟字母、数字、句号(.)、冒号、下划线、连结号(-)的组合,并且不能包含空白符,不能以 “xml”开头。尽管XML1.0标准允许使用任何长度的文件名,但是实际的XML处理器常常会限制标记名的长度。

  定义元素及其子元素

  对于以下的例子:

  ]>

  <联系人列表>

  <联系人>

  <姓名>张三

  准确的说法是,元素“联系人”必须包含一个,且只能包含一个子元素“姓名”。可如果子元素是“EMAIL地址”怎么办?联系人可能根本没有自己的EMAIL邮箱,也可能有好几个EMAIL帐号。

  使用正则表达式,我们就可以解决上述问题,描述父元素与子元素之间非常复杂的关系。例如,你可以对一个元素作如下任何一种类型的定义:它有一个子元素,有一个或多个子元素,有零个或多个子元素,至少有一个子元素。你还可以定义复合关系,比如“元素X是有效的,如果它含有一个或多个子元素Y,或一个子元素Z”。

  元素定义是由它们的元素内容模型(ECM)来描述的,也就是说,是由紧跟元素后面的括号中的内容来定义的。因此,正如我们前面见到的,元素“联系人”的ECM被描述为子元素“姓名”:

  ECM中的内容采取一组正则表达式的形式。在下表中,我们列出了正则表达式中可能出现的元字符:

  元字符 含义

  + 出现一次或多次

  * 出现零次或多次

  ? 可选,不出现或出现一次

  () 一组要共同匹配的表达式

  | OR,或,AND 要求严格遵从顺序要求

  下面几节中,我们将通过一些例子具体讲解这些元字符的用法,对使用正则表达式来定义ECM的方法获得一些感性认识。

  有顺序的子元素

  一个元素的各个子元素之间可以以任意顺序出现,也可以强制遵循一定的`顺序。

  考虑下面的Dtd定义:

  遵从这个Dtd的XML文件可以为:

  <联系人>

  <姓名>张三

  zhang@aaa.com

  同样,下面这个XML文件也是有效的:

  <联系人>

  zhang@aaa.com

  <姓名>张三

  由于我们在Dtd定义中仅仅用空白符分隔了元素“联系人”的两个子元素,这说明我们并没有严格要求两个元素出现的顺序,因此上面两种写法都是允许的。如果我们使用逗号“,”来分隔两个子元素,那么XML文件中,元素“姓名”就必须出现在元素“EMAIL”前面。

  重复元素

  让我们再把上节的例子作一个小小的改动:

  让我们看看前面给出的正则表达式的元字符集列表,它说明一个“联系人”元素中必须含有一个“姓名”元素,后面接一个或多个“EMAIL”元素。这样,下面的这段XML 文件是“有效的”。

  <联系人>

  <姓名>张三

  zhang@aaa.com

  zhang@hotmail.com

  zhang@yahoo.com

  那么下面这段XML文件不是有效的,因为它没有“EMAIL”元素,而“+”代表了“一个或多个”。

  <联系人>

  <姓名>张三

  如果你需要表示“零个或多个”,那么应该使用字符“*”。例如:

  成组元素

  子元素可以使用括号并为一组。因此,下面的Dtd片段说明,一个“联系人”元素中可以有一个或多个“姓名/EMAIL”子元素对,并且在每个子元素对中,“姓名”都放在“EMAIL”之前。

  符合这个Dtd的XML文件可以是:

  <联系人>

  <姓名>张三

  zhang@aaa.com

  <姓名>李四

  li@bbb.org

  <姓名>王五

  wang@ccc.org

  注意,仅仅是因为“+”由括号里面移到括号外面,元素“联系人”的内容就大大不同了。

  OR或

  号“|”描述了一个OR操作。因此,下面的Dtd片段所规定的XML元素是:所有的 “联系人”元素应该有一个“姓名”子元素,同时,在此之后还应该有一个“电话”或一个“EMAIL”元素,但不能同时有“电话”和“EMAIL”两个元素。

  一个符合上述Dtd定义的“有效的”XML文件的定义应该是:

  <联系人>

  <姓名>张三

  <电话>12345678

  或者是:

  <联系人>

  <姓名>张三

  zhang@yahoo.com

  注意:在一个组中,只允许使用一种连接符(例如“,”或“|”)。因此,象下面这样定义的Dtd是不合法的:

  要想使用多种连接符,只有通过创建子组的方式,使用

  可选子元素

  字符“?”说明一个子元素是可选的,它可以出现,也可以不出现。因此,在下面的Dtd 中,我们规定,每一个“联系人”都必须有一个“姓名”子元素,同时或者有一个“电话” 子元素,或者有一个“EMAIL”子元素,此外,它还可以包含一个“地址”子元素,也可以不包含这种元素。

  根据这个Dtd描述,下面的XML片段是“有效的”:

  <联系人>

  <姓名>张三

  zhang@aaa.com

  <地址>

  <街道>五街1234号

  <城市>北京市

  <省份>北京

  同样,下面这段不包含“地址”元素的XML片段也是“有效的”:

  <联系人>

  <姓名>张三

  zhang@aaa.com

  混合内容&空元素

  当然,可能也有一些时候,你在一个元素中既希望包含子元素,也希望包含纯文本。 XML中允许这种使用方法,并把这种元素称为混合内容的元素。在下面的例子中, “联系人”就是一个混合元素。

  ]>

  <联系人列表>

  <联系人>

  <姓名>张三

  <电话>(010)62345678

  zhang@aaa.com

  这是关于张三的信息

  注意,由于在“(姓名|电话|EMAIL|#PCDATA)”之外有“*”,所以在元素“联系人”中可以包含零个或多个“姓名”、电话、EMAIL和纯文本字段。

  还有一种情况没有说,那就是,一个元素中不包含任何子元素,也不包含纯文本。对于这种情况,我们可以定义一个空标记。当然,定义这样一个标记很简单,你只需要使用关键字EMPTY就可以了,例如: 这样,在你的XML文件中,就可以使用一个空元素。

  定义有效的元素属性

  现在我们已经学会如何定义一个元素以及它的内容,如何描述父元素与子元素之间错综复杂的关系,只差不知道如何定义元素的属性了。

  在第二篇教程中我们曾经提到过属性,那个例子是一个有关“商品”的元素,它有两个属性,即“类型”和“颜色”:<商品 类型 = "服装" 颜色 = "黄色">

  在Dtd中定义属性时,我们使用下面的格式:

  元素名是属性所属的元素的名字,在上面例子中,元素名是“商品”;属性名是属性的命名,例子中,“类型”和“颜色”是属性名;缺省值说明在XML文件中,如果没有特别说明属性的取值,语法分析器默认它具有的取值;属性类型则用来指定该属性是属于十个有效属性类型中的哪种类型。

  注意:由于ATTLIST是一个属性的列表,它可以包含很多属性,在实际应用中,一个元素也经常有多个属性。

  上面例子中的属性可以如下定义:

  类型 CDATA #REQUIRED

  颜色 CDATA #IMPLIED

  >

  在元素说明的四个部分中,我们需要再详细讨论一下元素类型和缺省值。在下一节中,我们就从缺省值说起。

  属性缺省值

  根据XML文件是否必须为一个属性提供取值,属性的缺省值又可以分为以下三类:

  必须赋值的属性

  关键字REQUIRED说明XML文件中必须为这个属性给出一个属性值。例如,假设你想定义一个"页面作者"元素,并把这个元素加入所有网站中的每一个页面。之所以定义这个元素,是为了页面编辑者能够提供他的联系信息,以便当发现页面错误或无效链接时,可以及时地通知他。在这种情况下,每个页面作者都有不同的个人信息,所以你无法事先知道应该用什么作为缺省值,但你又的确需要提供每个人的信息。这时候,你就可以把与联系信息相关的属性定义为必须的(REQUIRED),而且不用提供缺省值。

  属性值可有可无的属性

  当使用IMPLIED关键字时,文法解释器不再强行要求你在XML文件中给该属性赋值,而且也无须在Dtd中为该属性提供缺省值。可以说,这是对属性值有无的最低要求,现实中经常用到。

  固定取值的属性

  还有一种特殊情况,你需要为一个特定的属性提供一个缺省值,并且不希望XML 文件的编写者把你的缺省值替代掉。这时候,就应该使用FIXED关键字,同时为该属性提供一个缺省值。

  定义缺省值的属性

  如果不使用上面任何一种关键字的话,该种属性就是属于这种类型。对于这种属性,你需要在Dtd中为它提供一个缺省值。而在XML文件中可以为该属性给出新的属性值来覆盖事先定义的缺省值,也可以不另外给出属性值,后一种情况下它就默认为采用Dtd中给出的缺省值。

  至于究竟采用哪种缺省值,就看实际需要了。下面给出一个具体的例子:

  姓名 #CDATA #IMPLIED

  年龄 #CDATA #IMPLIED

  联系信息 #CDATA #REQUIRED

  网站职务 #CDATA #FIXED "页面作者"

  个人爱好 #CDATA "上网">

  属性类型

  一个元素可以为以下十种类型中的任意一种:

  CDATA

  Enumerated

  ID

  IDREF

  IDREFS

  ENTITY

  ENTITIES

  NMTOKEN

  NMTOKENS

  NOTATION

  下面我们就来一个一个讲述。

  CDATA类型

  CDATA指的是纯文本,即由字符、符号“&”、小于号“<”和引号“"”组成的字符串。当然,就象我们前面讲到的,你应该使用实体&代替“&”,<代替“<”, "代替“"”。

  请看下面这个关于剧本的例子:

  encoding="Gb2312"

  standalone = "yes"?>

  ]>

  <剧本>

  <对话 演员="某甲">我可不这么认为!

  <对话 演员="某乙">为什么呢?


【XML认证元素类型声明】相关文章:

1.IBM认证:XML入门XML简介

2.XML认证教程:Dtd

3.XML认证教程:XPATH

4.XML认证知识点:XML Schema

5.XML认证教程:DOM Parser

6.XML认证教程:SAX Parser

7.XML认证教程:名称空间

8.adobe技能认证类型