DTD约束

DTD约束
1.内部DTD的定义,语法如下:
<!DOCTYPE 根元素 [元素声明]>

元素名称:是自定义的名称,它用于定义被约束 XML 文档中的元素

元素内容:是对元素包含内容的声明,包括数据类型和符号两部分。XML 的元素分为简单元素和复杂元素两种,DTD 中元素的定义共有 5 种形式,其中前三种是简单元素的类型:

元素声明语法:

<!ELEMENT元素名(子元素[,子元素...])> 
1.(#PCDATA):普通字符串,PCDATA 是可解析字符数据(Parsed Character Data),要有括号()。

2.EMPTY:空元素,既不包含字符数据,也不包含子元素。如果在文档中元素本身已经表明了明确的含义,就可以在 DTD 中用关键字 EMPTY 表明空元素。
例如:<!ELEMENT br EMPTY>,其中br是一个没有内容的空元素。不用括号()

3.ANY:任何元素,表示该元素可以包含任何的字符数据和子元素。
例如: <!ELEMENT 联系人 ANY> 表示联系人可以包含任何形式的内容。
但在实际开发中,应该尽量避免使用 ANY,因为除了根元素外,其他使用 ANY 的元素都将失去 DTD 对 XML 文档的约束效果。不用括号()。

4.子元素:可以包含其他元素。通常用一对括号()将元素中要嵌套的一组子元素括起来,中间使用逗号“,”分隔,表示这些子元素按照这个顺序在 XML 中出现。
例如:<!ELEMENT  (书名,作者,售价)>表示元素书中要嵌套书名、作者、售价子元素,这些子元素只能出现一次,并且按照这个顺序编写。

如果一个子元素要出现多次,我们可以使用一些符号来表示次数:

“+” :表示 出现1次或多次

“?” :表示出现0次或1次

“*” : 表示出现任意次

例如: <!ELEMENT  (书名+,作者?,售价*)>

还有一个符号非常重要----竖线“|”,表示“或”的意思,如果几个子元素之间使用竖线“|”隔开,表示这几个子元素只能出现其中的任意一个。

例如: <!ELEMENT  (书名|作者|售价)>
2.属性定义

在定义元素的同时,还可以为元素定义属性。DTD 属性定义的基本语法格式:

属性声明语法为:

<! ATTLIST 元素名称 属性名称 属性类型 设置说明>

在上面属性定义的语法格式中,“元素名称”是属性所属元素的名字,“属性名称”是属性的名称,“属性类型”则是用来指定该属性是属于哪种类型,“设置说明”用来说明该属性是否必须出现。

关于“属性类型”和“设置说明”的相关讲解,具体如下

>1.属性类型

在 DTD 中定义元素的属性时,有 10 种属性类型可以选择,常见的几种属性类型介绍如下:

序号属性类型含义
1CDATA字符串,如果出现特殊字符,需要转义
2枚举类型枚举列表中的一个值,用竖线“|”隔开,每次只能选择一个。
3ID唯一的 id,只能是字母或下划线开始。
4IDREF另外一个元素的 id,【reference:引用,参考】
5IDREFS其他 id 的列表
6NMTOKEN合法的 XML 名称
7NMTOKENS合法的 XML 名称的列表
8NOTATION记号的名称
9EMTITY一个实体
10ENTITIES一个实体列表
>2.设置说明:

定义元素的属性时,有 4 种设置说明可以选择,具体如下:

- #REQUIRED,表示必须出现
- #IMPLIED,属性可有可无
- #FIXED value,表示一个固定值,#FIXED "ABC",表示属性必须是这个固定值"ABC"
- 默认值,表示一个默认值,如果元素不写该属性,该属性自动被设置为默认值。
如果写了该属性,就是用属性的实际值。

例如:

DTD 定义:<!ATTLIST 作者 分类 (AA|BB|CC) #REQUIRED>
XML 文件:<作者 分类="AA">传智播客</作者> 
DTD 定义:<!ATTLIST 书名 编号 ID #REQUIRED>

XML 文件:<书名 编号="a1">JavaWeb 程序开发入门</书名> 
DTD 定义:<!ATTLIST 售价 单位 CDATA #FIXED "元">

XML 文件:<售价 单位="">60</售价
小案例:电视节目表 DTD
<!DOCTYPE TVSCHEDULE [
    <!ELEMENT TVSCHEDULE (CHANNEL+)>
    <!ELEMENT CHANNEL (BANNER,DAY+)>
    <!ELEMENT BANNER (#PCDATA)>
    <!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
    <!ELEMENT HOLIDAY (#PCDATA)>
    <!ELEMENT DATE (#PCDATA)>
    <!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
    <!ELEMENT TIME (#PCDATA)>
    <!ELEMENT TITLE (#PCDATA)> 
    <!ELEMENT DESCRIPTION (#PCDATA)>
        
    <!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
    <!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
    <!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
    <!ATTLIST TITLE RATING CDATA #IMPLIED>
    <!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
]>

根据上面提供的 DTD 文档定义格式,写出 XML 文件内容

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE TVSCHEDULE [
……
]>
<TVSCHEDULE NAME="CCTV">
    <CHANNEL CHAN="CCTV-1">
        <BANNER>XXXX</BANNER>
        <DAY>
            <DATE>2019-03-11</DATE>
            <HOLIDAY>XXXX</HOLIDAY>
        </DAY>
        <DAY>
            <DATE>2019-03-12</DATE>
            <PROGRAMSLOT VTR="XXXX">
                <TIME>1900</TIME>
                <TITLE LANGUAGE="TTTT">XXXX</TITLE>
            	<DESCRIPTION>XXXX</DESCRIPTION>
            </PROGRAMSLOT>
        </DAY>
    </CHANNEL>
</TVSCHEDULE>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值