dtd约束

dtd快速入门

创建dtd文件对上一篇的XML代码进行约束,代码如下,文件名为Demo1.dtd

1 <!ELEMENT person (name,age)>
2 <!ELEMENT name (#PCDATA)>
3 <!ELEMENT age (#PCDATA)>

上面的XML代码修改为

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE person SYSTEM "Demo1.dtd">  //加入了这句
3 <person>
4     <name>张三</name>
5     <age>23</age>
6     
7 </person>

需要注意的地方:

约束在浏览器中打开不起作用,因为浏览器只负责校验XML语法,不负责校验约束,所以我们需要用到工具,我用的是myeclipse2017。

创建java项目,将xml文件和dtb文件都放到src下即可实现校验

dtd的三种引入方式

(1)引入外部dtd文件(即上面用到的)

<!DOCTYPE 根元素名称 SYSTEM "dtd文件路径">

(2)使用内部的dtd文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE person [
 3     <!ELEMENT person (name,age)>
 4     <!ELEMENT name (#PCDATA)>
 5     <!ELEMENT age (#PCDATA)>
 6 ]>
 7 
 8 <person>
 9     <name>张三</name>
10     <age>23</age>    
11 </person>

(3)使用外部的dtd文件

<!DOCTYPE 根元素  PUBLIC "dtd文件名称" "网络路径">

使用dtd定义元素

* 语法: <!ELEMENT  元素名  约束>

* 简单元素 :没有子元素的元素

      <!ELEMENT  name  (#PCDATA)>

      ***  (#PCDATA):约束name是字符串

      ***   EMPTY  :  元素为空

         ***  ANY: 任意

* 复杂元素 

<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>

当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。

声明只出现一次的元素

<!ELEMENT 元素名称 (子元素名称)>

声明最少出现一次的元素

<!ELEMENT 元素名称 (子元素名称+)>

声明出现零次或多次的元素

<!ELEMENT 元素名称 (子元素名称*)>

声明出现零次或一次的元素

<!ELEMENT 元素名称 (子元素名称?)>

声明多个元素只能出现其中一个

<!ELEMENT 元素名称 (子元素名称1 | 子元素名称2)>

dtd属性

语法

<!ATTLIST 元素名称 属性名称 属性类型 属性的约束>

示例

<!ATTLIST birthday ID1 CDATA #REQUIRED>

表示的事birthday的ID1这个属性为字符数据,而且属性值是必须出现的

 下面两个表格分别对应了属性类型及约束

实体的定义

语法:

<!ENTITY 实体名称 "实体的值">

示例:

<!ENTITY writer "Bill Gates">

使用实体:

<author>&writer;</author>

注意一般实体定义写在内部dtd里,因为外部dtd在某些浏览器下不支持

外部定义格式为:

<!ENTITY 实体名称 SYSTEM "URI/URL">

案例演练

下面是w3cSchool上的一个实例

电视节目表 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代码,就说明我们基本掌握了

<?xml version="1.0" encoding="UTF-8"?>
<!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>
]>

<TVSCHEDULE NAME="CCTV">
    <CHANNEL CHAN="AAA">
        <BANNER>HHHH</BANNER>
        <DAY>
            <DATE>2018-7-26</DATE>
            <HOLIDAY>556</HOLIDAY>
            <PROGRAMSLOT VTR="saklda">
                <TIME>12-23</TIME>
                <TITLE>hello</TITLE>
            </PROGRAMSLOT>
        </DAY>
    </CHANNEL>
</TVSCHEDULE>
原文地址:https://www.cnblogs.com/StriveE2/p/9368531.html