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)       预定义实体

实体

用途

&lt;

通常用来替换字符小于号(<)

&gt;

通常用来替换字符大于号(>)

&amp;

通常用来替换字符(&)

&quot;

可用来替换字符中的双引号(”)

&apos;

可用来替换字符中的单引号(’)

(2)       自定义实体

语法结构:

<!DOCTYPE rootname[

<!ENTITY entity-name “entity-content”>

]>



实例:

<!DOCTYPE Name[

<!ENTITY Name “terrychan”>

]>

 

摘自:http://www.cnblogs.com/ForEvErNoME/archive/2012/02/29/2373384.html

posted @ 2016-06-25 01:16  Eric-Lee  阅读(195)  评论(0编辑  收藏  举报