DTD:文档类型定义,可以定义合法的XML文档构建模块。使用一系列的合法标签元素来定义文档的结构。
现有一个XML文档内容如下:
<?xml version="1.0"?>
<note>
<to>Luffy</to>
<from>John</from>
<heading>Reminder</heading>
<body>Hello World!</body>
</note>
DTD的三种引入方式:
1.DTD文件位于XML源文件的外部,可通过以下格式引入外部的DTD文件:
格式:
<!DOCTYPE 根元素名称 SYSTEM "DTD文件路径">
示例:
<!DOCTYPE note SYSTEM "note.dtd">
2.DTD位于XML文件中:
格式:
<!DOCTYPE 根元素名称 [元素声明]>
示例:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Luffy</to>
<from>John</from>
<heading>Reminder</heading>
<body>Hello World!</body>
</note>
3.可以直接使用外部的DTD文件(多为网络上以有的DTD文件),这总方式在以后学struts2框架中使用配置文件时会用到。
格式:
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" “DTD文档的URL”>
示例:
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
使用DTD定义元素:在DTD文档中使用ELEMENT关键字来声明一个XML元素
复杂元素:带有子元素的元素
语法:
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
示例:
<!ELEMENT note (to,from,heading,body)>
简单元素:没有子元素
语法:
<!ELEMENT 元素名称 约束>
在定义复杂元素时,子元素列表定义一个元素,则只能出现一个子元素。若想出现多个则可以使用加号:+,星号:*,问号:?来表示出现的次数。其中,加号表示出现一次或者多次,问号表示零次或者一次,星号表示零次或者多次(任意次)。另外,在子元素列表中可以使用竖线:| 表示枚举列表中的一个值
简单元素中常见约束如下:
(#PCDATA) 表示元素名为字符串类型
EMPTY 元素为空(没有内容)
ANY 任意
示例:
<!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)>
DTD属性:
使用ATTLIST进行声明
语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
常见属性类型:
CDATA: 字符串
枚举 : 表示只能在一定的范围内出现值,但是只能每次出现其中的一个
ID: 值只能是字母或者下划线开头
常见属性的约束:
#REQUIRED:属性必须存在
#IMPLIED:属性可有可无
#FIXED: 表示一个固定值 #FIXED "AAA"
属性的值必须是设置的这个固定值
<!ATTLIST color ID CDATA #FIXED "blue">
实体的定义:
实体是用于定义用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。
内部实体声明:
语法:
<!ENTITY 实体名称 "实体的值">
示例:
<!ENTITY writer "大魔王">
实体的使用:&实体名称; (&+实体名称+;)
<author>&writer;</author>
外部实体声明:
语法:
<!ENTITY 实体名称 SYSTEM "URI/URL">
示例:
<!ENTITY writer SYSTEM "https://www.cnblogs.com/fxxk/">
使用:
<author>&writer;</author>
案例示范:
<?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="院线大片"> <CHANNEL CHAN="cctv-6"> <BANNER>动作片</BANNER> <DAY> <DATE>05-20</DATE> <PROGRAMSLOT> <TIME>19:0:0</TIME> <TITLE>复仇者联盟</TITLE> <DESCRIPTION>Hello World!</DESCRIPTION> </PROGRAMSLOT> </DAY> </CHANNEL> </TVSCHEDULE>
日期:2019-04-04
时间:22:21:43