DTD基本语法
指定与 XML 数据相关的DTD规则
XML中使用的与DTD相关联的“文档类型声明”写在XML声明之后
内部DTD规则
DTD 规则本身出现在目标 XML 文档中,这些规则仅应用于当前 XML 文档
指定内部DTD规则的语法
<?xml version="1.0" standalone="yes"?>< !DOCTYPE root_element [
…
]>
注:!DOCTYPE用于声明DTD文档
< !–root_element指的是xml文档的根元素-- >
例如:
<?xml version="1.0" standalone="yes"?>< !–内部DTD规则,定义在xml文档里的规则-- >
< !DOCTYPE student [
…
< !–此处进行元素以及属性的声明,注意根元素也需要声明-- >
…
]>
< !–xml文档的内容-- >
< student >
…
…
< /student >
外部DTD规则
作为一个单独的 DTD 文件关联于目标 XML 文档,这些规则可应用于多个XML 文档
指定外部DTD规则的语法
私有的外部 DTD 文件
这种外部 DTD 文件仅由某个开发人员、或者同属于某个小组的开发人员使用,其内容并不向外界公开
< !DOCTYPE root_element SYSTEM “DTD_location”>
注:STYSTEM用于声明私有的外部DTD文件
< !–DTD_location 表示获得这个 DTD 文件所需的相对的、或绝对的 URL-- >
例如:
<?xml version="1.0" standalone="no"?>< !–外部DTD文档定义于xml文档外,在使用时在xml文档内进行声明即可-- >
< !DOCTYPE book SYSTEM “book.dtd”>
< !–xml文档的内容-- >
< book >
……
< /book >
公开的外部 DTD 文件
这种 DTD 文件由权威机构制订的、提供给特定行业或公众使用的 DTD,甚至可能通过了国际标准化组织的批准,以便数据的提供者和使用者对所交互的数据进行有效性验证
< !DOCTYPE root_element PUBLIC “DTD_name” “DTD_location”>
注:PUBLIC用于声明公开的外部DTD文件
< !–如果解析器无法根据DTD_name找到相应的DTD文件,将进一步根据DTD_location所指示的位置进行查找-- >
DTD_name的语法
“prefix//owner_of_the_DTD//description_of_the_DTD//language_identifier”
//是不可缺少的
组成 | 作用 |
---|---|
prefix | 是否通过批准,是否是ISO标准 |
owner_of_the_DTD | 发布文档的机构 |
description_of_the_DTD | 对文档的简短描述 |
Language_identifier | 语言版本 |
prefix | 表示 |
---|---|
ISO | 通过批准的ISO标准 |
+ | 通过标准的非ISO标准 |
- | 未通过批准的非ISO标准 |
内外部DTD规则的组合使用
语法
< !DOCTYPE root-element SYSTEM “URI”[
…
]>
条件DTD
使用IGNORE和INCLUDE关键字来忽略或包含相应的DTD规则
语法
<!IGNORE [ 忽略的规则 ]]> <!INCLUDE [ 包含的规则 ]]>如果直接使用上述语法,则忽略或包含的DTD规则并不能提供任何价值
因此,需要配合参数实体注意:最后是两个]
条件DTD块在外部使用,把选择权交给XML文档
将实体定义为忽视,故可以在内部DTD重新定义外部DTD中被忽视的内容
参数实体作为条件DTD块的开关
IGNORE的优先级比INCLUDE高
元素
dtd元素的声明和元素属性的声明是分离的
DTD文件中元素的作用与书写位置无关
DTD文件中不允许使用多个元素约束同一个标记(用于限定xml时会出现歧义)
元素声明
语法
<!ELEMENT element-name category> <!ELEMENT element-name (element-content)>!ELEMENT 声明元素
元素的名称 element-name
指定元素的类别或者元素的内容模型
各部分之间的空格不可缺省
空元素
声明语法
<!ELEMENT element-name EMPTY>表示元素的内容为空,不包含子元素或者文本
包含任意内容的元素
声明语法
<!ELEMENT element-name ANY>表示元素中可以包含任何内容(没有具体的限制)
只包含文本内容的元素
声明语法
<!ELEMENT element-name (#PCDATA)>表示元素中只包含文本内容,不能包含子元素,也可以是空标记
只包含子元素的元素
语法声明
<!ELEMENT element-name (child1,child2,...)>(child1,child2,…) 表示一个序列,即内容模型
内容模型中各符号的意义
符号 | 含义 |
---|---|
, | 分隔序列中的每一项,严格按照顺序出现 |
| | 可从前后参数中任选一项 |
() | 括号中的内容是一个组 |
? | 出现0次或1次 |
+ | 出现次数大于等于1 |
* | 出现次数大于等于0 |
由于xml中子元素的顺序是有意义的,所以需要,来规定元素的出现顺序,未加次数限制,则必须出现且仅可出现一次
包含指定的子元素以及文本内容的元素
声明语法
<!ELEMENT element-name (#PCDATA | child1 | child2 | ...)*>表示元素中可以包含文本内容,以及子元素的任意组合(任意个数、任意顺序),甚至什么都不包括
必须将 #PCDATA 放在最前面,必须用*号结尾,必须用“|”分隔。
局限性:
只可约束子表记的类型,而不可约束其出现的次数及顺序
约束条件中不能出现限制符号
例如:(#PCDATA|子标记+|子标记*)是错误的
元素属性的声明
语法
<!ATTLIST element-name attr-name attr-type attdesc>声明多个属性的方法
- <!ATTLIST element-name attr1 attr-type1 attdesc1 attr2 attr-type2 attdesc2>
- <!ATTLIST element-name attr1 attr-type1 attdesc1> <!ATTLIST element-name attr2 attr-type2 attdesc2>
属性类型(attr-type)
类型 | 描述 |
---|---|
CDATA | 字符数据“Character data",可以是任意字符串,但是不能含有 " < & ,若需则用实体表示 |
(value1|value2|…) | 由 value1、value2 等构成的一个枚举类型,属性值必取其中之一 |
NMTOKEN | 全称Name Token——指定该属性值是字符串数据,但比CDATA具有更强的约束,即属性值只能由字母、数字、下划线**_、中划线-、点号( . )和冒号( : )** 以及数值实体(unicode)组成(与xml命名规范相同) |
NMTOKENS | 由空格隔开的多个 NMTOKEN |
ID | 表示属性的值在文档中是唯一的,可以由字母、数字、下划线_、中划线-、点号(.)组成,但必须以字母或下划线开头 |
IDREF | 表示属性的值引用另一个属性的 ID |
IDREFS | 由空格隔开的多个 ID |
ENTITY | 表示属性的值是一个实体 |
ENTITIES | 由空格隔开的多个 ENTITY |
NOTATION | 表示属性值是在dtd中声明了的未解析实体的类型 |
属性的描述(attdesc)
属性描述 | 含义 |
---|---|
value(字符串) | 表明元素的该属性的缺省值为value |
#REQUIRED | 表明元素的该属性是必须的,没有默认值 |
#IMPLIED | 表明元素的该属性是可选的,没有默认值 |
#FIXED value | 表明元素的该属性值为固定值 value |
ID 类型属性的默认情况只能是 #REQUIRED 和 “IMPLIED”无默认值
一个标记的若干属性中,不允许有两个属性的类型都是ID,ID是唯一的
实体
是内容的占位符,实体可以包含单个字符、字符串文本、甚至 XML 片段,只需要进行一次声明,就可以在文档中相应的地方多次使用
使用实体的目的:为了使得 XML 文档更容易编写、维护和阅读
根据占位符出现的位置不同,可以将实体分为两大类
参数实体
用于在DTD规则中进行占位,参数实体不包含XML文本,也不出现在XML文档的数据中,只在DTD中使用
内部参数实体
参数实体的声明和引用出现在相同的 DTD 中
声明语法
<!ENTITY % entity-name “entity_value">%与实体名之间用空格隔开
entity_value是entity-name代替的值
引用格式
%entity-name;
%与实体名之间无空格,引用语句后有分号;
外部参数实体
相当于将一个外部的文件导入到 DTD 中
声明语法
<!ENTITY % entity-name SYSTEM "URI">或
<!ENTITY % entity-name PUBLIC "public_ID" "URI">一般实体
用于在XML数据中进行占位,但是是在DTD文档中定义的
字符内容实体
包括内部字符内容实体和外部字符内容实体
命名实体
声明语法
<!ENTITY entity-name "entity_value">或
<!ENTITY entity-name SYSTEM "URI">entity_value 中不能包含XML标记(<、>、”、&),转义内容可以存在,并且将会对实体进行扩展
SYSTEM用于声明外部一般实体,否则为内部一般实体
引用语法
&entity-name;
预定义实体
在 XML 文档的文本内容和被解析器解析的字符数据中,都不能直接出现 <、>、”、’、&,必须使用对应的预定义实体(无需专门定义,可以直接使用)
字符 | 预定义实体(解析之后将被还原) |
---|---|
< | & lt;(less than) |
> | & gt;(great than) |
& | & amp; |
’ | & apos; |
" | & quot; |
注意&与字符之间无空格
数值实体
不需要进行定义,可以直接引用,使用数值来表示相应的内容,数值是字符所对应的 Unicode 代码
例如:
解析为:< title >学习XML< /title >
< !–点击即可查看源码即Unicode码-- >
< !–Browser视图,用浏览器的内置XML解析器解析后得到的XML文档树-- >
只能得到文档树
未解析实体
可在 XML 数据中指明关联二进制文件(图片、音频、视频等),由解析器通过调用对应的应用程序对这些文件进行解析,解析器本身无法处理这些非 XML 的数据
<!NOTATION gif SYSTEM "gif-viewer.exe">< !–定义未解析的实体的类型-- >
< !–此类型是由某个应用软件解读二进制图片文件-- >
NDATA gif表明其为未解析的数据,对应于NOTATION的声明gif
DTD文档的保存
保存DTD文件时所选择的编码必须和它要约束的XML文件保持一致
XML解析器发现文档中指定的dtd后会按照xml中指定的编码方式去解析dtd
浏览器内置XML解析器的作用
浏览器内置的XML解析器只检查XML关联的DTD文件本身是否有错,但不检查XML文件是否遵守了DTD文件的约束条件