DTD约束
Posted Aoian51CTO
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DTD约束相关的知识,希望对你有一定的参考价值。
DTD约束
1.内部DTD的定义,语法如下:
<!DOCTYPE 根元素 [元素声明]>
元素声明语法:
<!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 书 (书名,作者,售价)>表示元素书中要嵌套书名、作者、售价子元素,这些子元素只能出现一次,并且按照这个顺序编写。
如果一个子元素要出现多次,我们可以使用一些符号来表示次数:
例如: <!ELEMENT 书 (书名+,作者?,售价*)>
例如: <!ELEMENT 书 (书名|作者|售价)>
2.属性定义
在定义元素的同时,还可以为元素定义属性。DTD 属性定义的基本语法格式:
属性声明语法为:
<! ATTLIST 元素名称 属性名称 属性类型 设置说明>
>1.属性类型
序号 | 属性类型 | 含义 |
---|---|---|
1 | CDATA | 字符串,如果出现特殊字符,需要转义 |
2 | 枚举类型 | 枚举列表中的一个值,用竖线“|”隔开,每次只能选择一个。 |
3 | ID | 唯一的 id,只能是字母或下划线开始。 |
4 | IDREF | 另外一个元素的 id,【reference:引用,参考】 |
5 | IDREFS | 其他 id 的列表 |
6 | NMTOKEN | 合法的 XML 名称 |
7 | NMTOKENS | 合法的 XML 名称的列表 |
8 | NOTATION | 记号的名称 |
9 | EMTITY | 一个实体 |
10 | ENTITIES | 一个实体列表 |
>2.设置说明:
- #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>
]>
<?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>
以上是关于DTD约束的主要内容,如果未能解决你的问题,请参考以下文章