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约束的主要内容,如果未能解决你的问题,请参考以下文章

XML 约束

xml约束之dtd

XML的DTD约束

XML——XML文件约束之DTD详解

DTD约束

XML--约束