- 有效的(valid)XML文档。首先XML文档是个格式正规的XML 文档,然后有需要满足DTD的要求,这样的XML文档称为有效的XML文档。
- #PCDATA (Parsed Character Data),可解析的字符数据。
- 关于普通实体与参数实体
- 普通实体是在dtd中定义,xml中使用,使用的时候格式为,&address;
- 参数实体是在dtd中定义,dtd中使用,定义的时候使用%,使用的时候也需要使用%,%address;
- 外部普通实体的定义方式是:<!ENTITY address SYSTEM "http://www.shengsiyuan.com/xml.xml"> 表示使用http://www.shengsiyuan.com/xml.xml网址的内容来替换掉address ,而不是使用http://www.shengsiyuan.com/xml.xml_字符串本身来替换掉address。
-
外部参数实体:,<!ENTITY % address SYSTEM "http://www.shengsiyuan.com/xml.xml">,使用的时候: %address;
文档类型定义——(Document Type Definition)
DTD用来描述XML文档的结构,一个DTD文档包含
- 元素(ELEMENT)的定义规则
- 元素之间的关系规则
- 属性(ATTLIST)的定义规则
- 可使用的实体(ENTITY)或符号(NOTATION)规则
什么是DTD、为什么要用DTD
- DTD文档与XML文档实例的关系
- 类与对象
- 数据库表结构与数据记录
- 有了DTD,每个XML文件可以携带一个自身格式的描述
- 有了DTD,不同组织的人可以使用一个通用DTD用来交换数据
- 应用程序可以使用一个标准DTD校验从外部世界接受来的XML数据是否有效
- 可以使用DTD校验自己的XML数据
如何生成一个DTD文档
- DTD文档的声明和引用
- 内部DTD文档
-
<!DOCTYPE 根元素 [定义内容]>
-
- 外部DTD文档
-
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
-
- 内外部DTD文档结合
-
<!DOCTYPE 根元素 SYSTEM "DTD文件路径"[定义内容]>
- poem.xml
-
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE poem SYSTEM "dtd_1.dtd"> <poem> <author>王维</author> <title>鹿柴</title> <content>空山不见人</content> </poem>
-
-
dtd_1.dtd
-
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT ENTER_NAME_OF_ROOT_ELEMENT_HERE EMPTY> <!ELEMENT poem (author+, title*, content?)> <!ELEMENT author (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT content (#PCDATA)>
-
元素的定义
语法
<!ELEMENT NAME CONTENT>
- ELEMENT 关键字
- NAME 元素名称
- CONTENT 元素类型
- EMPTY 元素不能包含子元素和文本,但可以有属性 ——(空元素)
-
<!-- EMPTY示例——空元素 --> <!ELEMENT 人 EMPTY> <家庭> <人 名字="匹诺曹" 性别="男" 年龄="6"/> </家庭> <!-- 错误示例 --> <家庭> <人>匹诺曹</人> <人><大人>匹诺曹爸爸</大人></人> </家庭>
-
- ANY 元素可以包含任何在DTD中定义的元素内容,如果将根元素设置为ANY类型后,元素出现次数和顺序将不受限制。
-
<!-- ANY示例 --> <!ELEMENT 人 ANY> <家庭> <人>匹诺曹</人> <人><大人>匹诺曹爸爸</大人></人> </家庭>
-
- #PCDATA 可以包含任何字符数据,但是不能再其中包含任何子元素
-
<!-- #PCDATA示例 --> <!ELEMENT 人 (#PCDATA)> <家庭> <人 性别="男" 年龄="6">匹诺曹</人> </家庭> <!-- 错误示例 --> <家庭> <人><大人>匹诺曹爸爸</大人></人> </家庭>
-
- 纯元素类型 置包含子元素,并且这些子元素外没有文本
- 混合类型 包含子元素和文本数据的混合体
-
<!-- 组合类型示例 --> <!ELEMENT家庭(人+, 家电*)> <家庭> <人 名字="郭大路" 性别="男" 年龄="25"/> <人 名字="李寻欢" 性别="男" 年龄="38" 爱好="作个教育家和伟人"/> <家电 名称="彩电" 数量="3"/> </家庭>
-
- EMPTY 元素不能包含子元素和文本,但可以有属性 ——(空元素)
修饰符号
符号 | 用途 | 示例 | 示例说明 |
() | 用来给元素分组 | (古龙|金庸|梁羽生),(郦丹萍|王羿),我 | 分成三组 |
| | 在列出的对象中选择一个 | (男人|女人) | 表示男人或者女人必须出现,两者选一 |
+ | 该对象最少出现一次,可以出现多次(1次或多次) | (成员+) | 表示成员必须出现,而且可以出现多个成员 |
* | 该兑现允许出现零到任意多次(0到多次) | (爱好*) | 爱好可以出现零到多次 |
? | 该对象可以出现,但只能出现一次(0到1次) | (菜鸟?) | 菜鸟可以出现,也可以不出现,如果出现的话,最多只能出现一次 |
, | 对象必须按指定的顺序出现 | (西瓜,苹果,香蕉) | 表示西瓜、苹果、香蕉必须出现,并且按这个顺序出现 |
属性的定义
- 语法
-
<!ATTLIST /元素名称 属性名称 类型 属性特点 ...... >
-
- 类型
- CDATA
- 属性值可以是任何字符(包括数字和中文)
-
<!ATTLIST 木偶 姓名 CDATA #REQUIRED > <!ATTLIST 木偶 姓名="匹诺曹"/> <!ATTLIST 木偶 姓名="PiNuoCao"/> <!ATTLIST 木偶 姓名="123"/>
- 注意这里CDATA与CDATA节的区别,#PCDATA与CDATA的区别
- ID
- 表明 该属性的取值必须是唯一的
-
<!ELEMENT 公司职员 ANY> <!ATTLIST 公司职员 编号 ID #REQUIRED 姓名 CDATA #REQUIRED > <!-- 正确示例 --> <公司职员 编号="Z001" 姓名="张三"/> <公司职员 编号="Z002" 姓名="李四"/>
- IDREF/IDREFS
- IDREF属性的值指向文档中其它地方声明的ID类型的值
- IDREFS同IDREF,但是可以具有由空格分开的多个引用。
-
<!ELEMENT 家庭(人+)> <!ELEMENT 人 EMPTY> <!ATTLIST 人 relID ID #REQUIRED parentID IDREFS #IMPLIED name CDATA #REQUIRED > <家庭> <人 relID="P_1" name="爸爸"/> <人 relID="P_2" name="妈妈"/> <人 relID="P_3" parentID="P_1 P_2" name="儿子"/> </家庭>
- NMTOKEN/NMTOKENS
- NMTOKEN是CDATA的一个子集,表示属性值必须是英文字母、数字、句号、破折号、下划线或冒号,属性值不能含有空格。
- NMTOKENS与NMEOKEN类似,包含多个由空格分隔的字符。
-
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE poem[ <!ELEMENT ENTER_NAME_OF_ROOT_ELEMENT_HERE EMPTY> <!ELEMENT poem (title, content)> <!ELEMENT title (#PCDATA)> <!ELEMENT content (#PCDATA)> <!ATTLIST title author NMTOKEN #REQUIRED> ]> <poem> <title author="wangwei">鹿柴</title> <content>空山不见人</content> </poem>
- Enumerated
- 事先定义好一些值,属性的值必须在所列出的值的范围内
-
<!ATTLIST person 婚姻状态(single|married|divorced|widowed) #IMPLIED> <!ATTLIST person 性别(男|女) #REQUIRED>
- ENTITY/ENTITIES
- NOTATION
- NOTATIONS
- CDATA
- 属性特点
- #REQUIRED
- 元素的所有实例都必须有该属性的值(not null)
- 语法
-
<!ATTLIST 元素名 属性名 属性类型 #REQUIRED>
-
- 示例
-
<!ATTLIST person number CDATA #REQUIRED> <person number="5677" />
-
- #IMPLIED
- 元素的实例中可以忽略该属性(null)
- 语法
-
<!ATTLIST 元素名 属性名 属性类型 #IMPLIED>
-
- 示例
-
<!ATTLIST contact fax CDATA #IMPLIED> <person number="555-667788" />
-
- FIXED value
- 元素实例中该属性的值必须为指定的固定值
- 语法
-
<!ATTLIST 元素名 属性名 属性类型 #FIXED"value">
-
- 示例
-
<!ATTLIST sender company CDATA #FIXED"Microsoft"> <sender company="Microsoft"/>
-
- Default value
- 为属性提供一个默认的值
- 语法
-
<!ATTLIST 元素名 属性名 属性类型 "value">
-
- 示例
-
<!ATTLIST hello payment type CDATA "check"> <hello payment="check"/>
-
- #REQUIRED
实体
- 内部实体
- 语法
-
<!ENTITY 实体名 "实体值">
-
- 示例
-
<!ENTITY writer "Donald Duck."> <!ENTITY copyright "Copyright W3Schools."> <author>&writer;©right;</author>
-
- 语法
- 外部实体
- 语法
-
<!ENTITY 实体名 SYSTEM "URI/URL">
-
- 示例
-
<!ENTITY writer SYSTEM "http://www.w3schools.com/entities/entities.xml"> <!ENTITY copyright SYSTEM "http://www.w3schools.com/entities/entities.dtd"> <author>&writer;©right; </author>
-
- 语法
实体类型
实体类型有普通实体、外部实体、参数实体、外部参数实体
类型 | 普通实体 | 参数实体 | |
使用场合 | 用在XML文档中 | 只用在DTD中元素和属性的声明中 | |
声明方式 | 内部 | <!ENTITY 实体名 "文本内容"> | <!ENTITY % 实体名 "文本内容"> |
外部 | <!ENTITY 实体名 SYSTEM "外部文件URL地址"> | <!ENTITY % 实体名 SYSTEM "外部文件URL地址"> | |
引用方式 | &实体名; | %实体名 |