例4中,将元素
5)NMTOKEN和NMTOKENS
NMTOKEN是Name Token的简写,它表示由一个或者多个字母、数字、句点(.)、连字号(-)或下划线(_)所组成的一个名称。NMTOKENS关键字表示一种列表类型。一个元素的NMOTOKENS类型的属性设置值可以是同一个XML文件中的另外多个NMTOKEN类型的属性的设置值,每个NMTOKEN属性值之间用空格分隔。具体示例如下:
在上面的示例中,元素<用户>的“姓名”属性指定为NMTOKEN类型,元素<数据>的“授权用户”属性指定为NMTOKENS,与这段DTD定义语句对应的XML具体如下:
<用户 姓名="张三">
<用户 姓名="李四">
<数据 授权用户="张三 李四">
这里是一些授权访问的数据
数据>
6)NOTATION
现实世界中存在很多无法或不易用XML格式组织的数据,例如图像、声音、影像等等。对于这些数据,XML应用程序常常并不提供直接的应用支持,但可以通过设置NOTATION类型的属性来让一个外部应用程序进行处理。在DTD文件中,NOTATION定义语句分为两种情况,具体如下:
第一种情况: 第二种情况:
在上述定义语句中,第一种情况指定数据的MIME类型,第二种情况指定处理程序的URL路径。当使用NOTATION类型作为属性的类型时,首先要在DTD中使用语句定义相应的notation,接下来通过一个例来演示NOTATION属性的使用,如例5所示。
例5 notation.xml
<文件> <电影 演示设备=”mp”/> <文件>
在例5中,元素<电影>指定了两种可选的演示设备,一种是movPlayer.exe,一种是用来绘制GIF图像的应用程序。
7)ENTITY和ENTITYS
ENTITY对应的中文意思为实体(关于实体定义的细节,将在后面进行介绍)。当某个属性的类型设置为ENTITY时,表明其属性值必须为在DTD中使用语句定义的一个实体(entity)的引用。接下来看一段DTD定义的语句,具体如下:
与这段DTD定义语句对应的XML数据片断如下:
<电影 来源="&itcast;" />
需要注意的是,只有引用实体才可以作为ENTITY类型属性的设置值,参数实体不能用作ENTITY类型的属性的设置值。关于参数实体和引用实体的相关讲解,将在实体定义中进行详细讲解。
ENTITYS关键字用于表示一种列表类型,一个元素的ENTITYS类型的属性设置值可以是多个实体的引用,每个实体的引用之间用空格分隔,具体示例如下:
根据上面的DTD语句,如果想通过src属性引用两幅图像,则对应的XML数据如下所示:
三、实体定义
有时候需要在多个文档中调用同样的内容,比如公司名称,版权声明等,为了避免重复输入这些内容,可以通过语句定义一个表示这些内容的实体,然后在各个文档中引用实体名替代它所表示的内容。实体可分为两种类型,分别是引用实体和参数实体,接下来,针对这两种实体类型进行详细地讲解。
1)引用实体
引用实体的语法定义格式有两种:
(1) (2)
引用实体用于解决XML文档中内容重复的问题,其引用方式方法为:
&实体名称;
了解了引用实体的语法格式及其在XML文档中的引用方式,接下来通过一个案例来学习,如例6和例7所示。
例6 book.dtd
例7 book.xml
<书架> <书> <书名>Java就业培训教程书名> <作者>&itcast;作者> <售价>39.9售价> 书> <书> <书名>EJB3.0入门经典书名> <作者>黎活明作者> <售价>39.00元售价> 书> 书架>
用IE9.0以下的浏览器打开book.xml文件,浏览器显示的结果如图1所示。
图1提示的错误信息是“文本内容中发现无效字符。”这是因为book.dtd文件使用的是本地字符集编码,即GB2312编码,而DTD文件应该使用utf-8或者Unicode编码。需要注意的是,IE9以上版本的浏览器也不会提示错误。
接下来我们将book.dtd按照utf-8编码方式进行重新保存,保存方式如图2所示。
按照图2的方式完成编码保存后,用IE浏览器重新打开book.xml文件或者单击图1-10工具栏中的“刷新”按钮,浏览器显示的结果如图3所示。
从图1、3中可以看出,book.xml文件中的“&itcast;”被显示成“澳门大阳城APP入口官网,www.itcast.cn”。
2)参数实体
参数实体只能被DTD文件自身使用,它的语法格式为:
需要注意的是,在声明参数实体时,ENTITY、%、实体名和“实体内容”之间各有一个空格。
引用参数实体的方式是:
%实体名称;
了解了参数实体的语法格式和引用方式,接下来通过一段示例代码来演示参数实体的定义,具体如下:
在上面的示例中,DTD中定义了两个元素,分别是“个人信息”和“客户信息”,这两个元素的定义中都包含了“姓名| EMAIL|电话|地址”这一相同的部分,因此,可以将相同的部分定义为一个TAG_NAMES的参数实体,然后将“个人信息”和“客户信息”这两个元素的定义规则中的“姓名 | EMAIL | 电话 | 地址”部分替换成对TAG_NAMES这个参数实体的引用即可。
参数实体不仅可以简化元素中定义的相同内容,还可以简化属性的定义,具体示例如下:
在上面的示例中,由于多个元素都具有id和account这两个属性的相同定义,因此,可以将这两个属性的文本内容定义为一个名称为common.attributes的参数实体。当定义元素的属性时,通过引用common.attributes 这个参数实体,将该参数实体转换为id和account 这两个属性所定义的文本内容了。
值得一提的是,当DTD的元素和属性定义中要出现大量相同内容时,参数实体是一种非常不错的选择。因为如果需要修改DTD中相同的部分,只需要在参数实体的定义中修改即可。
猜你喜欢:
北京校区