XML学习笔记2——DTD
在上一篇笔记中,将文档类型分类时,曾经根据文档是否使用并遵守了DTD或Schema来区分为格式良好的XML和有效的XML,那么什么是DTD和Schema呢?DTD和Schema都是用来规范XML文档的,对XML文档进行语义约束的,DTD简单易用,Schema则功能强大。在这篇笔记中,首先学习一下DTD(Document Type Definition,文档类型定义)。
1、在XML文档中怎么使用DTD
导入方式 | 语法格式 | 说明 |
内部DTD |
<!DOCTYPE 根元素名[ |
将DTD定义放在XML文档内部,紧跟在XML声明和处理指令后面 如:<!DOCTYPE 模型列表[ <!ELEMENT 模型列表(模型)*> ]> |
外部DTD |
<!DOCTYPE 根元素名 SYSTEM "外部DTD的URI"> |
将DTD单独定义在一个文件内,然后通过关键字SYSTEM导入DTD 如:<!DOCTYPE 模型列表 SYSTEM "模型列表DTD文件的相对路径或绝对路径"> |
公用DTD |
<!DOCTYPE 根元素名 PUBLIC "DTD的标识名" "公用DTD的URI"> |
公用DTD,这种DTD一般是由某个权威机构指定,供特定行业或公众使用,通过关键字PUBLIC导入 如:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> |
2、 DTD的结构
DTD文档本身不是XML文档,而只是为XML定义语义约束的文档,DTD文档的语法非常简单,大致有如下结构:
(1)第一行是DTD文档的声明,语法和XML的声明相同
(2)0到多个注释部分,DTD注释与XML注释语法相同
(3)0到多个<!ELEMENT...>定义,每个<!ELEMENT...>定义一个XML元素
(4)0到多个<!ATTLIST...>定义,每个<!ATTLIST...>为XML元素定义一个属性
(5)0到多个<!ENTITY...>定义,每个<!ENTITY...>定义一个实体
(6)0到多个<!NOTATION...>定义,每个<!NOTATION...>定义一个符号
其中<!ELEMENT...>、<!ATTLIST...>、<!ENTITY...>、<!NOTATION...>4个定义彼此完全独立,无须互相嵌套,下面就逐一说明这四种定义。
3、定义元素
(1)元素类型定义,Element Type Definition,简称ETD
(2) 元素类型
元素类型 | 定义格式 | 说明 |
任意类型 | <!ELEMENT 元素名称 ANY> | 元素可以是字符串,可以是空元素,也可以包含子元素 |
字符串值 | <!ELEMENT 元素名称 (#PCDATA)> | 元素值只能是字符串,不可以是空元素,也不能包含子元素 |
空元素 | <!ELEMENT 元素名称 EMPTY> | |
包含子元素 | 比较复杂,需要详细定义子元素之间的顺序以及子元素出现的次数等 | |
混合类型 | <!ELEMENT 元素名称 (#PCDATA|子元素1|子元素2|...)*> | 指定值只能是几个确定的类型,比任意类型有更强的约束,但功能相当,应尽量使用混合类型 |
关于混合类型的定义,说明几点:
A:#PCDATA必须放在最前面
B:#PCDATA和各子元素之间只能用竖线(|)分隔,不要使用逗号分隔
C:不要在子元素之后使用?、*、+等表示频率的修饰符
(3)定义子元素
定义子元素的语法 | 说明 | 子元素的出现频率修饰词 | 说明 |
(子元素1,子元素2,...) | 使用英文逗号定义有序的子元素 | 默认(没有修饰词) | 出现一次,且只能出现一次 |
(子元素1|子元素2|...) | 使用竖线定义互斥的子元素 | ? | 出现0或1次 |
((子元素1,子元素2)|(子元素3,子元素4)) | 使用括号将子元素分组 | + | 出现1或多次 |
(子元素1|子元素2|...)+ | 使用竖线互斥,然后使用频率修饰实现定义无序的子元素 | * | 出现0或多次 |
4、定义属性
在XML中,属性不能单独存在,因此定义属性时必须指定属于哪个元素。定义属性的语法格式如下:
<!ATTLIST 属性所属的元素名称 属性名称 属性类型 [元素对属性的约束] [默认值]>
(1)属性类型
类型 | 说明 |
CDATA | 该属性值只能是字符串数据 |
(en1|en2|en3) | 该属性值必须是一系列枚举值之一 |
ID | 该属性值必须是有些的标识符,且该属性值可用于标识该元素,因此必须在此XML文档中唯一 |
IDREF | 该属性值必须是引用另一个已有的ID类型的属性值 |
IDREFS | 该属性值必须是引用已有的一个或多个ID类型的属性值,多个ID类型的属性值之间使用空格分隔 |
NMTOKEN | 该属性值必须是合法的XML名称,必须是字符串数据,比CDATA约束更强,只能由字母、数字、下划线、中划线,点号和冒号组成 |
NMTOKENS | 该属性值必须是一个或多个NMTOKEN类型的属性值,多个使用空格分隔 |
ENTITY | 该属性值是一个外部实体,比如图片 |
ENTITIES | 该属性值是一个或多个ENTITY类型的属性值,多个使用空格分隔 |
NOTATION | 该属性值是在DTD中声明过的符号(NOTATION),这是个将要过期的规范,尽量避免使用 |
xml: | 该属性值是一个预定义的XML值 |
(2)元素对属性的约束与默认值的关系
元素对属性的约束 | 说明 | 默认值 |
未指定 | 必须指定默认值 | |
#REQUIRED | 必须的属性,必须为相应元素提供该属性 | 不能指定默认值 |
#IMPLIED | 该属性可有可无 | 不能指定默认值 |
#FIXED | 该属性值是固定的,定义时必须指定固定值 | 必须指定默认值 |
5、定义实体
实体引用就是用一个字符串代替另一个字符串,类似于C语言中的宏,上一篇笔记中已经提到过XML中内置的5个实体引用,在这里接着看看怎么自定义实体引用。
实体类型 | 使用场所 | 定义语法 | 使用语法 | 说明 |
普通实体 | XML | <!ENTITY 实体名 "实体值"> | &实体名; | |
参数实体 | DTD | <!ENTITY % 实体名 "实体值"> | %实体名; | 必须在使用前先定义 |
外部实体 | XML | <!ENTITY 实体名 SYSTEM "实体值所在文件的URI"> | &实体名; | 这里外部文件必须是满足XML文档结构的文本文档 |
公用外部实体 | XML | <!ENTITY 实体名 PUBLIC "公用实体标识名" "实体值所在文件的URI"> | &实体名; | |
外部参数实体 | DTD | <!ENTITY % 实体名 SYSTEM "实体值所在文件的URI"> | %实体名; | |
公用外部参数实体 | DTD | <!ENTITY % 实体名 PUBLIC "公用实体标识名" "实体值所在文件的URI"> | %实体名; | |
未解析实体 | XML | <!ENTITY % 实体名 SYSTEM "实体值所在文件的URI" NDATA 符号名> | 需要通过ENTITY等类型的属性调用 | 未解析实体不能由XML文档解析,而需要根据相应的符号名去解析 |
公用未解析实体 | XML | <!ENTITY % 实体名 PUBLIC "公用实体标识名" "实体值所在文件的URI" NDATA 符号名> |
6、定义符号
定义符号也有两种语法格式,分别定义普通符号和公用符号:
符号类型 | 定义语法 |
普通符号 | <!NONATION 符号名 SYSTEM "符号值"> |
公用符号 | <!NONATION 符号名 PUBLIC "公用符号标识名" "符号值"> |
符号值通常有两种形式:
(1)MIME:通用MIME类型的文件总是由相应的程序负责处理
(2)外部程序所在路径:直接指定某个外部程序负责处理XML文档中的外部数据
符号通常有两种用途:
(1)如上,符号可以用来定义未解析实体
(2)符号可以作为ENTITY或ENTITIES类型的属性值
(3)符号还可以作为NOTATION类型的属性的值,定义NOTATION类型的属性时,语法如下:
<!ATTLIST 属性所属的元素 属性名 NOTATION (值1|值2|...) 约束 默认值>
比一般的属性定义多一个值的列表。
XML学习笔记2——DTD的更多相关文章
- delphi操作xml学习笔记 之一 入门必读
Delphi 对XML的支持---TXMLDocument类 Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...
- XML学习笔记
XML学习笔记 第一部分:XML简介 我们经常可以听到XML.HTML.XHTML这些语言,后两者比较清楚,一直不是很明白XML是什么,这里做一个总结. XML(eXtensible Markup L ...
- XML学习笔记(二)-- DTD格式规范
标签(空格分隔): 学习笔记 XML的一个主要目的是允许应用程序之间自由交换结构化的数据,因此要求XML文档具有一致的结构.业务逻辑和规则.可以定义一种模式来定义XML文档的结构,并借此验证XML文档 ...
- XML学习笔记(三) -- Schema
标签(空格分隔): 学习笔记 Schema的格式 XML Schema文档是由元素.属性.命名空间和XML文档中的其他节点构成的. XML Schema有两种重要的Schema模型:Microsoft ...
- XML学习笔记(四)-- 修饰XML文档的CSS
标签(空格分隔): 学习笔记 XML为存储结构化数据提供了强大的方法,但是它没有提供关于数据如何显示地信息,(数据的结构与数据表示无关).可以使用CSS来控制XML文档中各元素的呈现方式. CSS语法 ...
- XML学习笔记(1)--XML概述
XML基本概念 XML—extensible Markup Language(可扩展标记语言) XML最基本的三个概念 1)XML语言---描述事物本身(可扩展) 2)XSL语言---展现事物表现形式 ...
- XML学习笔记之XML的简介
最近,自学了一段时间xml,希望通过学习笔记的整理能够巩固一下知识点,也希望把知识分享给你们(描红字段为重点): XML(extensible Markup language):可扩展的标记语言,解决 ...
- Python之xml学习笔记
XML处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,至今很多传统公司如金融行业的很多系统的接口还主要是xml. xml的格式如下,就是通过&l ...
- XML学习笔记(2)--dom4j操作XML
1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...
随机推荐
- MySQL入门手册
本文内容摘自MySQL5.6官方文档,主要选取了在实践过程中所用到的部分文字解释,力求只摘录重点,快速学会使用MySQL,本文所贴代码地方就是我亲自练习过的代码,凡本文没有练习过的代码都没有贴在此处, ...
- 【九度OJ】题目1061:成绩排序
题目描述: 有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息. 输入: 测试数据有多组,每组输入 ...
- android 中IntentService的作用及使用
IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同 ...
- Hbase随笔2
Hbase是建立在HDFS上的分布式数据库,下图是Hbase表的模型: Hbase这个数据库其实和传统关系数据库还是有很多类似之处,而不是像mongodb,memcached以及redis完全脱离了表 ...
- rabbitmq安装
1.从源码安装最新的otperlang17,版本(otp_src_17.1.tar.gz): ./configure make make install 2.有可能要安装 和simplebean ...
- android开发时使用游标时一定要关闭
原代码如下: places = getPlaceDatas(context, cursor); cursor.close(); 应改为: try{ places = getPlaceDatas(con ...
- chrome浏览器root用户运行
vim /usr/bin/google-chrome 58 exec -a "$0" "$HERE/chrome" "$PROFILE_DIRECTO ...
- VHDL生成的ngc文件被verilog的工程调用的问题
1. 问题的提出 工程a是一个soft core,用VHDL写的,综合的时候去掉了"Add I/O buffers" ,并将-iob(Pack I/O Registers into ...
- html5实战2
<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-e ...
- PCFG -- 基于统计方法生成语法树
语法树的作用 一棵语法树不仅包括了词性(part of speech), 还包括了短语(如名词短语, 动词短语)和结构化的信息(如主语, 谓语和宾语). 这些信息是进行机器翻译所必须的, 例如机器翻译 ...