>>在XML文档中引入DTD
文档类型声明必须位于XML声明后,且在根元素(文档元素)之前。不过,在XML声明和文档类型声明之间可以插入注释和处理指令
方式有两种:
1)内部DTD
〈?xml version="1.0" encoding='gb2312' standalone="yes"?〉
〈?DOCTYPE greeting[
〈!ELEMENT greeting (#PCDATA)〉
]〉
2)外部DTD(引用DTD的单独文件.dtd似于INCLUDE)
用PUBLIC或SYSTEM关键字来指出外部的DTD文件位置
语法:〈!DOCTYPE 根元素的名字 SYSTEM "外部DTD文件的URI"〉
例:〈!DOCTYPE greeting SYSTEM "hello.dtd"〉
例外:假如为了规范国内企业的人力资源管理,各企业的代表经过协商制定了人力资源管理方面的DTD,我们现在要引用这个DTD,就要用PUBLIC而不是SYSTEM关键字
语法:〈!DOCTYPE 根元素的名字 PUBLIC "DTD的名称" "外部DTD文件的URI"〉
public声明公共的DTD
-//sun xin //DTD HR 1.0//ZH
注:
- 为无组织 ;
//sun xin 为sunxin所有
//DTD HR 1.0为描述
//ZH 为中文编写
〈!DOCTYPE HR PUBLIC "-//sunxin //DTD HR 1.0//ZH" "http://www.sunxin.org/xml/dtds/hr.dtd"〉
有时可看到:
〈!DTDTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"〉
它表明文档符合一项非标准- 的HTML4.01的DTD,由W3C用英语编写,这个DTD位于http://www.w3c.org/TR/html4/stict.dtd
>>文档类型声明与文档类型定义(DTD)的区别
〈!DOCTYPE greeting SYSTEM "hello.dtd"〉是文档类型声明
〈!ELEMENT greeting (#PCDATA)是文档类型定义
注:文档类型声明可以包含(内部DTD子集)或引用(外部DTD子集)一个文档类型定义。如果文档依赖于外部文档,即使不使用standalone属性,XML处理器也能够很好地进行处理
>>元素类型声明
语法:〈ELEMENT 元素名称 元素内容说明〉
有五种要能的元素内容形式如下:
1)#PCDATA (说明元素包含字符数据)
例:
〈?xml version="1.0" encoding="gb2312"?〉
〈!DOCTYPE hr [
〈!ELEMENT hr(#PCDATA)〉
]〉
〈hr〉人力资源标准〈/hr〉
注:指明这个XML文档有一个根元素hr,它的内容只能是字符数据,hr元素内容是“人力资源标准”
2)子元素(说明元素包含的是子元素,当一个元素只包含子元素,而没有字符数据时,则称此元素类型具有元素型内容
①内容模型是决定子元素类型和子元素出现顺序的一种简单语法
通过例子看内容模型的语法:
〈?xml version="1.0" encoding="gb2312"?〉
〈DOCTYPE hr[
〈!ELEMENT hr (employee)〉
〈!ELEMENT employee(#PCDATA)〉
]〉
〈hr〉
〈employee〉雇员信息〈/employee〉
〈/hr〉
②进一步说明元素employee 有三个子元素name、age、sex,并按顺序出现:
〈?xml version="1.0" encoding="gb2312"?〉
〈!DOCTYPE hr [
〈!ELEMENT employee(name,age,sex)〉
〈!ELEMENT name(#PCDATA)〉
〈!ELEMENT age(#PCDATA)〉
〈!ELEMENT sex(#PCDATA)〉
]〉
〈hr〉
〈employee〉
〈name〉张三〈/name〉
〈age〉25〈/age〉
〈sex〉男〈/sex〉
〈/employee〉
〈/hr〉
③我们可以用竖线(|)来分隔元素
〈?xml version="1.0" encoding="gb2312"?〉
〈!DOCTYPE hr[
〈!ELEMENT hr(employee)〉
〈!ELEMENT employee(name,age,sex,salary)〉
〈!ELEMENT name(#PCDATA)〉
〈!ELEMENT age(#PCDATA)〉
〈!ELEMENT sex(#PCDATA)〉
〈!ELEMENT salary(cash | credit_card)〉
....
这种元素内容模型称为选择,选cash或credit_card其中一个子元素
④有时需体现员工的兴趣爱好,这时可以用星号(*)来实现,星号表示零或多个
〈?xml version="1.0" encoding="gb2312"?〉
〈!DOCTYPE hr [
〈!ELEMENT hr(employee)〉
〈!ELEMENT employee(name,age,sex,interest*)〉 //可有可无的interest子元素
〈!ELEMENT name(#PCDATA)〉
〈!ELEMENT age(#PCDATA)〉
〈!ELEMENT sex(#PCDATA)〉
〈!ELEMENT name(#PCDATA)〉
]〉
〈hr〉
〈employee〉
〈name〉张三〈/name〉
〈age〉25〈/age〉
〈sex〉男〈/sex〉
〈interest〉篮球〈/interest〉
〈interest〉游泳〈/interest〉
〈/employee〉
〈/hr〉
⑤如果至少有一种爱好可以用加号(+)来说明一个或多个子元素〈!ELEMENT employee(name,age,sex,interest+)〉
⑥用?号表示员工配偶信息〈!ELEMENT employee ((name,age,sex),interest+,spouse?)〉
⑦综合实例:〈!ELEMENT 简历(名字,性别,(电话|手机),家庭住址?,兴趣爱好*,教育经历+,工作经验*)〉
3)混合内容
表明元素既可以包含字符数据,也可以包含子元素。混合内容必须被定义零个或多个
〈?xml version="1.0" encoding="gb2312"?〉
〈!DOCTYPE employee [
〈!ELEMENT employee (#PCDATA | name)*〉 //表示employee元素的内容可以包含0个或多个字符数据,包含0个或多个name子元素
〈!ELEMENT name(#PCDATA)〉
]〉
〈employee〉
员工信息
〈name〉张三〈/name〉
〈/employee〉
注:用竖线分隔的#PCDATA和元素的列表是合法的,其它用法都是不合法的。
4)EMPTY
声明的空元素:〈!ELEMENT br EMPTY〉 //表明br是一个没有内容的空元素.
5)ANY
表明该元素可以包含任何的字符数据和子元素,只要它们不违反XML格式
〈!ELEMENT employee ANY〉 //我们要尽量不用ANY ,定义一个明确的DTD