Web Services 应用开发学习笔记(二):XML文档类型定义
本文内容:
1. 什么是XML文档定义类型
2. DTD声明
3. 内部DTD
4. 外部DTD
5. DTD语法
1. 什么是XML文档定义类型
我们使用XML的目的是为了实现数据的交换和共享,如何能够让其他用户能够理解我们所创建的XML文档结构(包括元素,属性等),这时候就需要制定某种通用的方式来说明这个XML文档的语法规则。所以,XML1.0提供了一种机制——文档类型定义(Document Type Definition,简称DTD),并将其作为规范的一部分。就类似每个产品都有特定的功能说明书,而这个功能说明书可以简单理解成DTD。
最后我就联想到的html所定义的标签,<h1>,<br>,<hr>等其实应该也是遵循一定的标准,有对应的文档类型定义。
2. DTD声明
XML文档中通过DOCTYPE声明将XML与DTD建立关联的指令,当读到DOCTYPE指令时,它会获取相应的DTD,并根据其中定义的规则对XML文档进行校验。
DTD声明的组成:关键字、文档的根元素名称、可选的外部标记符,以及可选的标记声明块。
(1)语法结构:
<?xml version=”1.0” ecoding=”UTF-8”?>
<!DOCTYPE Stundents…>
<Students>
(2)语法解析:
上述代码使用“<!DOCTYPE>”声明标记,文档的第一个元素(根元素)是Students。
<!DOCTYPE>声明方法有两种:内部DTD声明和外部DTD声明。
<!DOCTYPE>声明必须位于XML声明后,且在任何文档元素之前,但是,XML声明和DOCTYPE声明之间可以插入注释和处理指令。
3. 内部DTD
使用“<!DOCTYPE[….]>”语句进行内部声明。
(1)语法结构:
<?xml version=”1.0” ecoding=”UTF-8”?>
<!DOCTYPE element-name[
元素描述
]>
<!—文档数据区-- >
(2)语法解析:
<!DOCTYPE:表示开始设定DTD,注意DOCTYPE必须大写。
element-name:指定此DTD的根元素名称,一个XML文件只有一个根元素。
实例:
<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE students[
<!ELEMENT students (student)+>
<!ELEMENT student (name,age,class)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT class (#PCDATA)>
]>
<students>
<student>
<name>TerryChan</name>
<age>22</age>
<class>3</class>
</student>
</students>
4. 外部DTD
外部DTD是一个独立的XML文档的文件,实际上也是一个文本文件,只是使用.dtd作为文件扩展名。使用外部DTD可以被多个XML文档引用,操作更加方便。
(1)语法结构:
<!DOCTYPE type-of-doc SYSTEM/PUBLIC “dtd-name”>
(2)语法解析:
<!DOCTYPE:表示开始设定DTD。
type-of-doc:指定文档类型的名称,由用户自己定义,通常与使用这个DTD文件的XML文档的根元素一致。
SYSTEM/PUBLIC:这两个参数只能选择一个。SYSTEM是指使用私有的外部DTD文件,PUBLIC是指调用公有的外部DTD文件。
dtd-name:存放DTD文件的路径和名称
因此,引入外部DTD的XML文档的结构如下:
<?xml version=”1.0” ecoding=”UTF-8”?>
<!DOCTYPE 根元素名 SYSTEM/PUBLIC “DTD文件的路径和名称”>
<!—文档数据区-- >
实例
students.dtd
<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE students[
<!ELEMENT students (student)+>
<!ELEMENT student (name,age,class)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT class (#PCDATA)>
]>
students.xml
<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE students SYSTEM “students.dtd”>
<students>
<student>
<name>TerryChan</name>
<age>22</age>
< class >3</class>
</student>
</students>
5. DTD语法
一个DTD文档包含:元素的定义规则、元素间关系的定义规则、元素可使用的属性以及可使用的试题或符号规则等。
1. 元素的声明
(1)元素是XML的核心,它包含了实际的文档信息,并指出这些信息的逻辑结构。元素以树形分层结构排列,可以嵌套在其他元素中。元素的名称可以是字母、数字,也可以使用标点符号,如:冒号,下划线,连字符和句号等,但是不能以数字开头,第一个字符只能是字符、下划线或冒号。
(2)语法结构:
<!ELEMENT element-name element-definition>
(3)语法解析:
<!ELEMENT:表示开始元素设置,注意ELEMENT必须大写。
element-name:表示要设置元素的名称。
element-definition:表示元素之间(<元素></元素>)内容的类型。
(4)XML中按照element-definition元素的内容可以划分为ANY类型、EMPTYL类型、#PCDATA类型、父元素类型和混合元素类型。
a.ANY类型
如果不需要对元素的内容进行限制,可以使用ANY元素类型。
语法结构:
<!ELEMENT element-name ANY>
b.EMPTY类型
元素中没有内容,不能包含子元素和文本,但可以有属性。
语法结构:
<!ELEMENT element-name EMPTY>
实例:
<!ELEMENT student EMPTY>
c.#PCDATA类型
元素中可以包含任何字符数据,但是不能包含任何子元素
语法结构:
<!ELEMENT element-name ( #PCDATA) >
实例:
<!ELEMENT name ( #PCDATA) >
d.父元素类型
父元素类型只能包含子元素,并且这些子元素外没有文本。通过正则表达式规定子元素出现的顺序和次数。
正则表达式的元组运算:
符号 |
意义 |
? |
使用“?”修饰的元素可以不出现或只出现一次 |
* |
使用“*”修饰的元素可以不出现或出现多次 |
+ |
使用“?”修饰的元素必须至少出现一次 |
无符号 |
没有修饰符的元素只能出现一次 |
() |
用来给元素分组 |
| |
只能在列出的对象中选择一个 |
, |
列出的对象必须按指定的顺序出现 |
实例:
符号 |
意义 |
(A|B|C) |
只能从A,B,C中选择一个出现 |
(A+) |
A必须出现,而且可以出现多次 |
(B*) |
B可以不出现,如果出现,可以出现多次 |
(C?) |
C最多可以出现一次,可以不出现 |
(A,B,C) |
A,B,C必须出现,而且必须按顺序出现 |
(A+B+C),(D|E),F |
分成三组 |
e.混合元素类型
混合元素类型是包含子元素和文本数据的混合体。
语法结构:
<!ELEMENT 元素名 (#PCDATA| element-name1| element-name2|…) >
实例:
<!ELEMENT students (#PCDATA| student)* >
2.属性声明
属性是对元素的补充和修饰,它能够将一些简单的特性与元素相关联。例如,在HTML标记<img>,src就是一个属性。一个元素可以有多个属性来修饰。
语法结构:
<!ATTLIST 元素名
属性名称 属性类型 取值方式
属性名称 属性类型 取值方式
……
>
属性取值方式:
取值 |
含义 |
#REQUIRE |
元素的每个实例必须包含该属性 |
#IMPLIED |
元素的实例可以选择性地包含该元素 |
#FIXED value |
固定取值的属性,该属性不允许被其他值替代 |
默认值 |
事先定义了默认值的属性 |
属性类型:
类型 |
含义 |
CDTAT |
纯文本,由字符组成的字符串 |
ID |
以属性值的方式为文档中的某个元素定义唯一的标识 |
IDREF |
属性值引用已定义的ID值,方法是把那个元素的ID标识值作为该属性的取值 |
IDREFS |
IDREFS是IDREF的复数形式,取值可以使若干个ID值,这些ID的值用空格隔开 |
ENTITY |
取值为一个已定义的实体 |
ENTITIES |
该属性值包含了多个外部ENTITY,不同的ENTITY用空格隔开 |
NMTOKEN |
表示该属性值是符合XML命名规范的名称 |
NMTOKENS |
该属性值包含了多个外部NMTOKEN,不同的NMTOKEN用空格隔开 |
NOTATION |
取值为一个DTD中声明的符号,此类型对于使用非XML格式的数据非常有用 |
3.实体
实体(ENTITY)是在XML中预先定义的,类似于程序中使用的常量,可以在多个文档中调用同一个实体,方便操作。实体有两种类型:一种是预定义的实体;另外一种是自定义的实体。
(1) 预定义实体
实体 |
用途 |
< |
通常用来替换字符小于号(<) |
> |
通常用来替换字符大于号(>) |
& |
通常用来替换字符(&) |
" |
可用来替换字符中的双引号(”) |
' |
可用来替换字符中的单引号(’) |
(2) 自定义实体
语法结构:
<!DOCTYPE rootname[
<!ENTITY entity-name “entity-content”>
]>
实例:
<!DOCTYPE Name[
<!ENTITY Name “terrychan”>
]>