超越学XML与DTD技术总结笔记(之三)

>>在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值