系统架构设计师教程第四十讲

写在前面:

承诺是件很容易的事,只要上下嘴唇轻轻一碰即可,做起来可就难了。失信是一件很可怕的事,久而久了,便会把自己丢失掉!

~~~~~~~~~~~~~~~~~~~

8.3.5实体的声明

1.什么是实体

简单地说,实体(entity)是一些预先定义好的数据,在需要使用这些数据的时候通过引用的方法将它放入特定的位置。使用实体的好处在于对于一些重用率很高的数据,通过将它们定义成实体,减少对这类数据进行修改是必须做的重复工作。另外,通过实体可以把一些特殊的数据,如声音文件、图片文件等引入XML文档。

根据不同的角度可以对实体进行多种不同的分类:按照实体存储的部位的不同,实体可以分为内部实体和外部实体;按照实体的组成内容的不同,实体可以分为可分解实体和不可分解实体两种;按照实体引用方式的不同,可以分为一般型实体和参数型实体。不同类型的实体的声明和使用方法略有不同,下面进行详细的介绍。

2.内部实体和外部实体

内部实体在声明的时候就被完整地定义,因此应该想到,内部实体只能是文本型的数据。内部实体的声明方法如下:

!ENTITY实体名称实体内容>

实体的引用方法是:

&实体名称;

如下例子说明如何声明并引用实体。

?xmlversion="1.0"encoding="ute-8"?

!ELEMENTContractDate(#PCDATA)

!ELEMENTContractName(#PCDATA)

!ELEMENTContractNo(#PCDATA)

!ELEMENTContractType(#PCDATA)

!ELEMENTTransaction(ContractNo,ContractType,ContractName,ContractDate)]

Transaction

ContractNoContractNumber/ContractNo

ContractTypeFOB/ContractType

contractNameContractName/ContractName

ContractDateContractDate/ContractDate

/Transaction

外部实体的声明虽然在DTD文档中,但是实体代表的数据本身存储于DTD文档之外。外部实体的声明方法如下:

!ENTITY实体名称SYSTEMIPUBLIC"URI">

有关属性SYSTEM和PUBLIC的意义和DTD声明中介绍的一样,这里不再重复。

外部实体的引用方法和内部实体是一样的。

最后要说明的是特殊字符的使用问题。在XML中,一些字符被赋予了特殊的意义,当不想使用这些字符的特殊意义而引用它们时,就使用实体引用的方式。表8-3是常特殊字符的实体引用方式。

3.可分解实体和不可分解实体

可分解实体又称为文本实体。所谓可分解是指可以被XML验证器所解读,并且在解读后将实体的内容放入引用该实体的位置上去,例如相对于可分解实体,不可分解实体就是不能直接被XML验证器所解读的实体,例如图片、声音文件等。由于XM校验器本身不能解读这种实体,所以在声明这类实体时应该声明它的格式以及处理该实体的应用程序的位置。下面是不可分解实体的声明方法:

!NOTATION格式SYSTEM

PUBLIC处理程序的URI

!ENTITY实体名称SYSTEM

PUBLIC实体的URINDATA格式

实体的引用方式没有变化。

?xmlversion="1.0"encoding="ute-8"?

!DOCTYPETransaction[

!ELEMENTContractDate(#PCDATA)

!ELEMENTContractName(#PCDATA)

!ELEMENTContractNo(#PCDATA)

!ELEMENTContractType(#PCDATA)

!ELEMENTTransaction(ContractNo,ContractType,ContractName,ContractDate)

!NOTATIONgifSYSTEM"C:\paint.gif"

!ENTITYproductPictureSYSTEM"picture.gif"NDATAgif]

Transaction

ContractNoContractNumber/ContractNo

ContractTypeFOB/ContractType

contractNameContractName/ContractName

ContractDateContractDate/ContractDate

Product

PictureProductpicture/Picture

/Product

/Transaction

4.一般型实体和参数型实体

到现在为止,所介绍的实体都是一般型实体。这种类型的实体不仅可以在XML文件本体中引用,而且可以在它所在的DTD中使用。在所在DTD中使用应该注意的是,一般只用于对另外的实体的声明,不用于对元素的声明中,同时应该避免实体中引用实体时产生循环引用的现象。

一般型实体在引用时都采用如下方式:&实体名称;而将要介绍的参数型实体则有很大不同,这类实体只在外部DTD声明中使用,而且不同于一般型实体,它可以用于元素的声明中。它的声明语法如下:

!ENTITY%实体名称实体内容

引用语法如下:

%实体名称

可见,参数型实体和一般型实体有着很大的不同。事实上,可以把参数型实体看作在声明外部DTD时为避免重复工作提供的一种方法。如果有机会读到一些用作行业标准的DTD文档,会发现其中存在着大量的参数型实体的引用。

对一般型实体和参数型实体的区别总结如表8-4所示。

8.3.6属性的声明

属性是XML提供的描述元素某些性质的信息,XML本身提供了一些默认属性,如最早在处理语句<?xmlversion="1.0"encoding="UTF-8"standalone="no"?就接触到默认属性version、encoding和standalone,当然除了默认属性以外,还可以根据需要自行设计属性,在一个良构XML文档中,属性只要满足命名规则就可以了,但是在一个有效的XML文档中,属性要经过DTD的属性声明,这是DTD声明中比较复杂的一部分。

在DTD声明中,属性的声明语法可以归纳为如下形式。

!ATTLIST元素名称属性名称属性类型属性默认值类型>

这里需要说明的是,元素名称指的是属性所属的元素名称,关于属性类型和属性默认值类型是属性中比较复杂的内容,下面详细地进行介绍。

1.属性类型

属性类型是对属性取值的约東,属性值类型共有7种选择下面一一介绍。

(1)CDATA类型:CDATA类型是最简单的属性类型,也是约束最少的属性类型,代表该属性值为一般的文字,除此没有其他限制。声明语法如下:

<!ATTLIST元素名称属性名称CDATA属性默认值类型>

(2)枚举型:枚举型列举了该属性所能取得的全部值。声明语法如下:

<!ATTLIST元素名称属性名称(可选属性值

可选属性值2

...

可选属性值n)属性默认值类型>

(3)NMTOKEN和NMTOKENS类型:使用NMTOKEN属性类型时,表明该属性的属性值只能由字母、数字、“_”等字符所构成的字符串,即属性值满足命名规则,且不能出现空格。NMTOKENS属性则表明属性值可能由若干个满足NMTOKEN属性要求结合在一起形成的,即多个NMTOKEN之间可能存在空格,声明语法如下:

!ATTLIST元素名称属性名称NMTOKENINMTOKENS属性默认值类型>

(4)ENTITY和ENTITIES类型:当属性值是一个外部实体的引用时,用ENTITY来说明属性类型;一般来说,当属性值是一个内部实体引用时,将属性类型声明为CDATA即可。

(5)NOTATION类型:在介绍不可分解实体类型时已经提到过NOTATION的声明,当属性只是一个声明过NOTATION格式时,将属性声明为NOTATION类型。由此也可以看出,在把一个属性声明为NOTATION类型时,首先应该确定存在相应的NOTATION声明。下面把NOTATION声明和NOTATION类型属性声明的语法写在一起。

NOTATION格式SYSTEMIPUBLIC处理程序的URI

ATTLIST元素名称属性名称NOTATION属性默认值类型>

(6)ID类型:CDATA类型对于属性的限制是比较少的,ID类型是在CDATA类型的属性类型上加入一点更强的约束条件,那就是作为此类型值的名字只能在XML文件中出现一次。此即,ID类型的值必须能唯一标识元素。

(7)IDREF和IDREFS类型与ID类型相对,IDREF就是IDREFERENCE的意思,表明该属性的取值是对声明过的一个ID型属性值的引用,也就是说,IDREF类型的值必须匹配某些ID属性的值。同样道理,IDREFS类型表明该属性的取值是对声明过的多个ID型属性值的引用。

2.属性默认值类型

属性默认值类型有4种可选情况,下面一一介绍它们的使用时机和使用方法。

(1)#IMPLIED表明该属性可出现可不出现,声明语法:

!ATTLIST元素名称属性名称#IMPLIED

(2)#REQUIRED表明该属性一定要出现,声明语法:

!ATTLIST元素名称属性名称#IMPLIED

(3)#FIXED表明该属性一定要出现,且固定为特定值,不许用其他值,声明语法:

!ATTLIST元素名称属性名称#FIXED属性特定值

(4)特定属性值表明该属性的默认值,当XML文档中没有显式给出该属性的取值时,取此值。当该属性的取值已经显式地给出时,则为给出值:

<--!ATTLIST元素名称属性名称属性默认值>

8.4XMLSchema

DTD在制定标记语言方面历史悠久,早在XML正式标准出现以前就已经存在,当时它配合SGML来制定标记语言,是专门为SGML服务的DTD。当XML出现之后,DTD尽管进行了很大的简化,但还是一门风格和XML完全不同的语言,不经过细致学习,根本不可能应用这种语言制定标记语言。而schema文档是一种特殊的XML文档,它遵循XML的语法要求,避免用户再去另外学习一套语法,同时schema语法结构简单,容易学习和使用。因而在发展势头上schema高于DTD。

DTD的另一个缺点是数据类型相当有限。在DTD中根本不提供数值数据类型,例如整数、浮点数、布尔数等,所有的文档内容都是字符数据。而schema则提供了丰富的数值类型,不但有整数、浮点数等常用的类型,还提供了自定义数据类型的机制。

一个XML文档只能使用一个DTD文档,尽管DTD可以通过多数实体机制来部分改变这种缺点,但还是严重地导致了DTD的继承和使用的有限性。schema则采用了名域空间的机制,使得一个XML文档可以调用多种schema文档。在代码的重用性和可扩展性方面要远远优于DTD。

8.4.1逻辑XMLSchema的文档结构

XMLSchema则是一类特殊的XML文档,除了具有XML文档的语法要求外,还要有一些特殊的要求。下面给出了这种文档的一个模板程序1,任何的XMLSchema文档只要在该文档的基础上进行继续编写即可。

程序1

文件1.xml

?xmlversion="1.0"?

Schemaxmlns="urn:schemas-microsoft-

转载请注明:http://www.sonphie.com/jbby/14389.html

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 网站简介| 发布优势| 服务条款| 隐私保护| 广告合作| 网站地图| 版权申明

    当前时间: