XML详解
XML 文档头部
一个标准的XML 文档由两大部分组成:文档头部(序言)和文档主体(文档元素)。
XML 文档头部的作用是通知解析器按相关条件和限制对XML 文档进行解析。在XML 文档
中,文档头部可以包括声明、注释、处理指令和文档类型定义四部分。按XML 规范要求,“声
明”必不可少,并且作为文档的第一条语句出现,其他部分根据需要确定其有无。
1.XML 声明
XML 声明是文档头部的第一条语句,也是整个文档的第一条语句。XML 声明语句的格式
如下:
<?xml version=” version–number” encoding=” encoding –declaration” standalone=”
standalone-status” ?>
XML 声明语句,以:“<?xml”开始、以“?>”为结束,表示这是一个XML 文档。在这条
声明语句中可以包含三个属性(三条信息):
(1)XML 版本
Version:它表明使用的XML 规范的版本号,以便解析器进行正确的解析。当前XML
的最新版本依然是1.0 版。最新XML 信息可访问W3C 网站:www.w3.org/TR/REC-xml。关
于XML 1.0 版本的内容可访问网站:www.w3.org/TR/2000/REC-xml-20001006。
注意:xml 和Version 必须小写
(2)使用的字符集
在声明语句中,用encoding 指定本XML 文档使用的字符集。XML 文档中的字符遵守
Unicode 标准。为了能容纳所有国家、民族的字符,Unicode 采用16 位编码。编码是Unicode
字符的字节序列表示。XML 解析器至少能够识别UTF-8 和UTF-16 两种编码。英文用UTF-8
编码。
如果使用简体汉字,必须给encoding 属性赋值为“GB2312”。若指定繁体汉字赋值为
“BIG5”。
(3)standalone 属性
standalone 属性指定本XML 文档是否需要外部的DTD 文档作为本文档的校验依据。也
即本XML 文档是否是一个独立文档。默认值是“yes”,表示是独立文档不需要外部DTD
关联,否则应该赋值为“no”。
这三个属性中,Version 属性是必须的,并且必须放在“<?xml”符号之后,其他两个是
可选项,按需要加入,其出现顺序没有限制。
2.处理指令(Process Instruction – PI)
处理指令是在XML 文档中由应用程序进行处理的部分,XML 解析器把信息传送给应用程
序,应用程序解释指令,按照它提供的信息进行处理。处理指令是以:“<?”开始、以“?>”
为结束,其格式是:
<?处理指令名称处理指令信息?>
以“xml-[name]”开头的处理指令指定的是[name]中给出的与XML 相关的技术。下面
的处理指令以“xml-stylesheet”开头,指明相关的技术是样式表,这条指令就被传送给由type
指定的引擎,而不传给XML 解析器。
<?xml-stylesheet type=”text/css” href=”file1.css”?>
该语句中type 表示关联的文档类型,现在的文档是文本、层叠样式CSS 类型引擎,href
指定关联的文档所在位置和文档的名称。
下面的命令是将XML 文档与一个扩展层叠样式(XSL 引擎)文件eeexxx—666—111…xxxssslll 关联,各
属性的作用依然相同。
<?xml-stylesheet type=”text/xsl” href=”ex-6-1.xsl”?>
以上是使用较频繁的两条指令,它们规定XML 文档中的数据使用哪一种格式在浏览器
上显示。后章节的实例中这类语句会反复出现。
3.注释
XML 中使用注释对文档进行解释说明,增加程序的可读性,处理程序不对注释标记的
内容进行处理。与HTML 一样,注释是由“<!— ”开始,由“–>”结束,注释语句的格式
是:
<!– 注释文字–>
使用注释必须注意如下规则:
(1)注释可以出现在文档头部,也可以出现在主体部分,但不能出现在声明之前,声
明语句必须是XML 文档的第一条语句。
(2)注释可以包容标记,使标记失去作用,但注释不能出现在标记中。
<?xml version=”1.0″ encoding=”gb2312″?>
<Schema
xmlns=”urn:schemas-microsoft-com:xml-data”
xmlns:dt=”urn:schemas-microsoft-com:datatypes”>
<AttributeType name=”学号” dt:type=”ID” required=”yes”/>
<!–<ElementType name=”学生档案信息” content=”eltOnly” model=”closed”> –>
<ElementType name=”学生信息” content=”mixed” model=”open”>
……
</ElementType>
……
</Schema>
在上面例子中,为了调试的需要,使用注释将元素声明语句<ElementType name=”学生
档案信息” ……>屏蔽起来,使该语句失去作用。
(3)两条短横线是注释开始、结束标识的组成部分,在注释内容中不能包含“—”。
处理指令(Process Instruction – PI)
处理指令是在XML 文档中由应用程序进行处理的部分,XML 解析器把信息传送给应用程
序,应用程序解释指令,按照它提供的信息进行处理。处理指令是以:“<?”开始、以“?>”
为结束,其格式是:
<?处理指令名称处理指令信息?>
以“xml-[name]”开头的处理指令指定的是[name]中给出的与XML 相关的技术。下面
的处理指令以“xml-stylesheet”开头,指明相关的技术是样式表,这条指令就被传送给由type
指定的引擎,而不传给XML 解析器
<?xml-stylesheet type=”text/css” href=”file1.css”?>
该语句中type 表示关联的文档类型,现在的文档是文本、层叠样式CSS 类型引擎,href
指定关联的文档所在位置和文档的名称。
下面的命令是将XML 文档与一个扩展层叠样式(XSL 引擎)文件eeexxx—666—111…xxxssslll 关联,各
属性的作用依然相同。
<?xml-stylesheet type=”text/xsl” href=”ex-6-1.xsl”?>
以上是使用较频繁的两条指令,它们规定XML 文档中的数据使用哪一种格式在浏览器
上显示。
注释:
XML 中使用注释对文档进行解释说明,增加程序的可读性,处理程序不对注释标记的
内容进行处理。与HTML 一样,注释是由“<!— ”开始,由“–>”结束,注释语句的格式
是:
<!– 注释文字–>
使用注释必须注意如下规则:
(1)注释可以出现在文档头部,也可以出现在主体部分,但不能出现在声明之前,声
明语句必须是XML 文档的第一条语句。
(2)注释可以包容标记,使标记失去作用,但注释不能出现在标记中。
<?xml version=”1.0″ encoding=”gb2312″?>
<Schema
xmlns=”urn:schemas-microsoft-com:xml-data”
xmlns:dt=”urn:schemas-microsoft-com:datatypes”>
<AttributeType name=”学号” dt:type=”ID” required=”yes”/>
<!–<ElementType name=”学生档案信息” content=”eltOnly” model=”closed”> –>
<ElementType name=”学生信息” content=”mixed” model=”open”>
……
</ElementType>
……
</Schema>
在上面例子中,为了调试的需要,使用注释将元素声明语句<ElementType name=”学生
档案信息” ……>屏蔽起来,使该语句失去作用。
(3)两条短横线是注释开始、结束标识的组成部分,在注释内容中不能包含“–”。
文档类型定义
如果XML 文档需要使用DTD 作有效性验证, 则文档类型定义以
“<!DOCTYPE …………>”形式在根元素标记符前面出现。使用DTD 进行文档的有效性
验证时,无论是内部DTD 还是引用外部DTD 文档都需要使用这一形式予以标注。具体的
下例中第一条是声明语句,第二条是注释语句,
第三条是文档类型定义语句(黑体字部分),它们组成该文档的头部。
<?xml version=”1.0″ encoding=”gb2312″ standalone=”yes” ?>
<!— 下条是文档类型定义的开始–>
<!DOCTYPE COMPANY_INFO [
<!ELEMENT COMPANY_INFO (COMPANY)>
<!ELEMENT COMPANY (NAME, ADDRESS)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENTADDRESS (#PCDATA)>
<!ENTITY gsmc “成都寰宇西太平洋科技开发信息技术有限公司”>
<!ENTITY add “成都泰山环东路138 号北大太平洋科技发展中心48 楼”>
]>
<!— 下面是文档主体部分–>
<COMPANY_INFO>
<!–这是一家联系紧密的公司–>
<COMPANY>
<NAME>&gsmc;</NAME>
<ADDRESS>&add;</ADDRESS>
</COMPANY>
</COMPANY_INFO>
文档主体
文档主体是由一个称为文档(根)元素和多个低层元素构成的树型结构组成。其中也可
以有PI 和注释。XML 与HTML 不同,描述元素的标记是由用户定义的,在一个XML 文档
中,主体部分描述数据的结构和各元素间的关系,并将这种描述交应用程序处理。例如,一
个描述通讯录的简单XML 文档,除了声明语句外,文档主体部分显示如下:
<?xml version=”1.0″ encoding=”gb2312″?>
<!– 下面是XML 文档主体部分–>
<通讯录>
<友人1>
<姓名>王辉</姓名>
<工作单位>亚细亚生活用品公司</工作单位>
<邮编> 389971</邮编>
<电话>
<办公室电话>62953877</办公室电话>
<家庭电话>85354854</家庭电话>
<手机>13080056482</手机>
</电话>
</友人1>
<友人2>
<姓名>白声水</姓名>
<工作单位>天一投资咨询公司</工作单位>
<邮编> 610041</邮编>
<电话>
<办公室电话>6855273/办公室电话>
<家庭电话>769255346</家庭电话>
<手机>139080456562</手机>
</电话>
</友人2>
…………
</通讯录>
在这个实例中,主体是由根元素“通讯录”开始、结束的,“友人n”是第一层子元素,
它的内部又包含四个更低层子元素。“友人1”、“友人2”、……“友人n”是同级元素。在
主体中,每个元素都有开始、结束标记,都包含有数据内容,元素间实现了正确的嵌套。该
文档展现了一个简单的树型结构,如图
XML 标记命名
1.标记必须以字母或下划线开头,后跟字母、数字、下划线、横线和圆点等,XML 名
称中不能包含空格,不能以字符串“xml”作为开头;
下面是合法的XML 标记名称:
<city.stree>
<myfile-name>
<content_11>
下面是非法的XML 标记名称:
<city stree>
<11_content>
<tody&one>
2.标记是大小写敏感的;
xmL 是大小写敏感的,下面的标记可视为不同的标记:
<Character>
<character>
<CHARACTER>
3.标记不可重复定义;
由于现代通信的发展,每个人拥有两部以上的电话是非常普遍的事情,但是,如果我们
在通讯录中仅仅简单地列出某人使用的多个电话,如下面代码所示,则违反了标记不可重复
定义的规定。
<友人>
<姓名>王辉</姓名>
<工作单位>亚细亚生活用品公司</工作单位>
<邮编> 389971</邮编>
<电话>62953877</电话>
<电话>13080056482</电话>
</友人>
解决的办法是对不同的电话给予不同的标记名称,用<办公室电话>、<家庭电话>、<手
机>等进行区分。
每个元素必须有起始、结束标记
空元素标记
没有内容的元素标记称空标记(空元素),空标记可以有属性。空标记有两种表示方法:
第一种,使用正常的起始标记和结束标记:
<IMG src=”d:\direct\public\flawer.jpg”></IMG>
元素“IMG”是空元素,在起始标记<IMG>包含着名为“src”属性。
第二种,使用简便方式,将起始标记和结束标记合并在一起,把结束标记中的斜线放到
起始标记的末尾:
<IMG src=”d:\direct\public\flawer.jpg”/>
元素是XML 内容的基本单位。元素的作用是指定一个信息块。元素有如下格式:
<ElementName> Content </ElementName>
元素内容放置在起始、结束标记中。元素内容可以由子元素、或者其他类型的数据构成。
最简单的元素包含的是文本内容。它的语法格式是:
<元素标记>文本内容</元素标记>
如果元素内容是另外的元素,则形成元素的嵌套,例如:
<电话>
<办公室电话>62953877</办公室电话>
<家庭电话>85354854</家庭电话>
<手机>13080056482</手机>
</电话>
XML 规范严格规定必须保证正确的嵌套结构,元素的结束标记出现的顺序与起
始标记出现的顺序严格相反,不允许出现交叉
文档元素(根元素)及树型结构
1.根元素
在XML 文档中只有、也必须有一个根元素,它类似HTML 中的<BODY>和</BODY>,
表示文档主体的开始和结束。除了根元素以外,其他所有元素都是子元素。
2.元素必须正确嵌套
XML 文档中的元素必须正确嵌套。
属性放置在元素起始标记中,其格式:
<元素标记名属性名=”属性值” 属性名=”属性值”…>
或
<元素标记名属性名=”属性值” 属性名=”属性值”…>
注意:在HTML 中属性值可以不用引号引上,但XML 规定其属性值只能是字符串型,
不允许有数字形式的属性值。所以,属性值必须用单引号或双引号引上后再赋给属性名。下
例是正确的表示方法:
Ex2-5.xml
<?xml version=”1.0″ encoding=”gb2312″?>
<计算机系学生登记表>
<学生学号=”1236″ 性别=”女”>王芳</学生>
<学生学号=”0694″ 性别=”男”>李奇</学生>
<学生学号=”6288″ 性别=”男”>黄昂扬</学生>
<学生学号=”5864″ 性别=”女”>文笛声</学生>
</计算机系学生登记表>
综上所述,在定义属性时应该关注5 个问题:
(1)标记中可以使用多个属性,但属性名称不得重复;
(2)属性名是大小写敏感的;
(3)属性只能出现在起始标记或空标记中;
(4)属性值必须用(英文)引号引上;
(5)少用属性,尽可能用子元素。因为属性有以下缺陷:
. 属性值不能包含多重数值,但是元素可以;
. 属性值很难扩展;
. 属性不能描述结构内容,但是元素可以;
. 属性值很难通过DTD 进行测试
实体(Entity)是XML 的存储单元。一个实体可以指包含的单个字符、字符串、数据
记录、文件和其他二进制数据等等,使用实体的主要目的是为了避免在XML 文档中重复输
入。如果用户为一个文件指定一个实体名,以后就可以在XML 文档中使用实体名来取代该
文件,当XML 文档被解析时,实体名被替换为指定的文件。
实体通过实体引用(Entity References)插入到文档中。实体引用是以&开始到分号之间的
实体名称。下面的例子是合法的实体引用:
<book>"云南印象"</book>
<公司名称>< 红旗超市> &<红旗联锁></公司名称>
CDATA 节
如果在XML 文档中包含程序代码或包含大量“<”、“>”符号,我们再用单个符号的实
体引用来实现标记符号的转义是十分困难的,大量的符号不允许再用这种费力而低效的处理
方式,为此XML 规范中引入了CDATA 节。CTADA 节用:“<![CDATA[”作为起始定界符,
用“]]>”作为结束定界符。>
首先,对XML 文档设立约束条件,通过验证是否
满足约束而判断XML 文档的有效性;其次,一个DTD 文档可以为多个XML 文档所使用,
这种重用会降低文档的制作成本、节省开发时间并保证文档格式统一化、标准化;最后,
DTD 解释数据结构和使用方法,这在数据交换时保证各方对数据的相同理解以及对数据库
的动态建立和访问都是非常重要的。P
DTD 在建立之前,必然会针对具体的XML 目标,如学生管理、商品销售、图书资料等
文档制定相应的规则。当DTD 制作完成后,应用该DTD 的所有文档都要使用它作为建立
XML 文档的标准,元素的名称、出现顺序、元素应该包含的内容、元素是否使用属性以及
属性的名称、个数、取值等都严格按照DTD 的规定进行。由此可见,设计、规划DTD 与
程序设计技术中的数据结构设计非常相似。
既然DTD 是为了约束XML 文档而存在, DTD 声明出现在XML 文档头部便是理所当
然的事情。这样,可以保证XML 解析器从开始就掌握文档结构的定义规范。以便从根元素
开始对文档元素逐一进行验证。一个完整的DTD 规范包含如下内容:
. DTD 声明
. 元素的定义规则及相关信息
. 属性的种类极其使用
. 定义元素之间的关系、元素的排列方式
. 定义实体机制及其引用
文档类型声明以“<!DOCTYPE 根元素名[”开始,以“]>”为结束。按XML 规范要
求,第一个被定义的应该是根元素,这里根元素是“COMPANY_INFO”,紧接着下一行是
第一个子元素……
文档类型声明是通过编写一行行DTD 声明语句来实
现的,DTD 声明语句显然与XML 文档的语法规则毫无相同之处。因此,掌握DTD 意味着
学习一套新的语法规则
DTD 分内部DTD 和外部DTD,它们都应该在XML 文档头部出现
内部DTD 是包容在XML 文档内部的文档类型定义,所有的元素、属性、实体声明都
存在于XML 文档的DTD 声明段中。
DTD 是对XML 文档中的元素从开始到结束的逐一描述,这意味着DTD 必须按XML
元素的层次自上而下地进行定义,首先定义根元素,第一层子元素……再逐层定义低层子元
素。内部DTD 是针对该XML 文档自身的有效性验证而为,没有对其他的XML 文档进行约
束的能力。
内部DTD 由于“寄生”在XML 文档内部,必然会增加文档的长度,但是内部DTD 方
式可以在网络上更高效地传送信息,因为只需下载XML 文件自身即可。XML 通过声明语
句的“standalone”属性来表示XML 文档是否可以独立存在。使用内部DTD 时,XML 文档
的声明语句应该这样编写:
<?xml version=”1.0″ standalone=”yes” ?>
即声明语句的“standalone”属性应赋值为“yes”,或者采用缺省方式。
外部DTD
如果把所有的DTD 声明语句行放在一个单独的文档中,并以扩展名“.dtd”保存。在
需要使用这个DTD 文档进行验证的XML 文档中,用DTD 声明语句与之关联,这样的文档
就是外部DTD 文档,简称外部DTD。
外部DTD 是非常有用的,当有多个结构类似的XML 文档需要有效性验证时,可为它
们建立一个公用的外部DTD。无疑,这可大大降低编写成本,减少DTD 文档的修改、维护
难度,保证XML 文档的格式统一。外部DTD 是效率较高、节省开销的好方式。
使用外部DTD 时,XML 文档头部XML 声明语句中“standalone”属性被赋值为“no”,
表示本文档不是独立文档。文档类型声明语句中,在根元素后面使用关键字“SYSTEM” 表
示需要引用外部DTD 文档,文档的URL 出现在“SYSTEM”之后。例如:
<?xml version=”1.0″ encoding=”gb2312″ standalone=”no” ?>
<!DOCTYPE dlib SYSTEM “pcbook.dtd”>
<dlib>
……
……
</dlib>
在外部DTD 的声明语句中,用关键字“PUBLIC”取代“SYSTEM”即可指向“公共
标识符”,公共标识符的格式要求:
第一个域指定DTD 链接到一个正式标准,如果是自定义DTD,可以把域设置为“-”;
第二个域代表编写DTD 的机构或个人名称;
第三个域指出文档的类型和版本号;
第四个域指出DTD 使用的语言;
各个域之间用双斜线“//”分隔。
公共标识符的格式如下:
-//Company Name//Document Description//Language
在公共标识符后面给出DTD 文档名,就可实现用“PUBLIC”的外部DTD 引用。例如:
<!DOCTYPE add_book Public “-//apple ,Inc.//Address Book//EN”“application.dtd”>
当解析器遇到公共标识符时,搜索文件目录,定位文件,如果解析器不能转换公共标识
符,它将使用系统标识“SYSTEM”。公共标识符继承自SGML,除WAP 电话之类的XML
应用外已经较少使用。
元素是构成XML 文档的基础,元素的名称就是标记,元素声明是DTD 文档的首要任
务。有效的XML 文档的每一个元素都必须符合DTD 文档指定的格式。DTD 中使用
<!ELEMENT >实现元素类型声明,其格式如下:
<!ELEMENT 元素名称元素内容声明>?
在格式声明中,<!ELEMENT 表示元素声明开始,单词“ELEMENT”必须用大写字符,
“>”表示该声明结束。元素名称即XML 文档的标记,必须符合标记名称的命名规定。
元素类型声明以“<!ELEMENT”开始,后跟元素名称,最后部分是元素内容声明。在
“元素内容声明”部分定义该元素所包含内容的逻辑结构,并且利用这个逻辑结构检查XML
文档的有效性。“元素内容声明”包含如下五个内容:
1.#PCDATA
“元素内容声明”为#PCDATA 时表示已解析的字符数据(parsed character data),与
CDATA 相反,它是一个要由XML 分析器处理的XML 数据。当一个元素的内容只是字符数
据、即不包含子元素时,利用PCDATA 进行声明。如下面三条声明语句指定元素名称分别
为name、sex、ID,而它们只能包含字符内容:
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT ID (#PCDATA)>
ANY
如果在XML 文档中要使用一个没有固定内容结构的元素,则在元素内容声明中指定为
ANY,ANY 声明可以是包含已定义的所有元素,并且这些元素可以按任何顺序出现,ANY
声明指定元素内容可以是元素也可以是字符数据。
使用ANY 可以获得极大的灵活性但失去了对文档结构的约束,因此,尽量少用为妙。
通常的做法是:在DTD 开发初期因为无法确定某元素的结构时,先将其声明为ANY,当确
定了该元素结构后再重新声明为准确的形式。
“元素内容声明”为ANY 的格式如下:
<!ELEMENT 元素名称ANY>
EMPTY
“元素内容声明”为EMPTY 的格式:
<!ELEMENT 元素名称EMPTY>
一个元素可以没有任何内容,即可以没有任何子元素、没有任何字符数据,此时这个元
素就是空元素,元素内容声明为EMPTY。空元素中可以加入属性,以满足特定需要。例如,
HTML 中的图像标记<IMG>是一个单标记,它使用SRC 属性来指定欲显示的图片文件的位
置、文件名和扩展名。假如在XML 中要使用<IMG>元素标记,则在DTD 中将它声明为空
(EMPTY)元素:
<!ELEMENT IMG EMPTY>
一个元素可以没有任何内容,即可以没有任何子元素、没有任何字符数据,此时这个元
素就是空元素,元素内容声明为EMPTY。空元素中可以加入属性,以满足特定需要。例如,
HTML 中的图像标记<IMG>是一个单标记,它使用SRC 属性来指定欲显示的图片文件的位
置、文件名和扩展名。假如在XML 中要使用<IMG>元素标记,则在DTD 中将它声明为空
(EMPTY)元素:
<!ELEMENT IMG EMPTY>
在XML 文档中IMG 就可以用带属性的空标记方式出现:
<IMG src=”d:\mydir\public\flower.jpg>”></img>
又例如<HR>标记在HTML 中也是单标记,在XML 文档中可以定义为:
<HR size=”4″ color=”#f08080″ />
子元素
“元素内容声明”可以指定元素仅包含子元素
<!ELEMENT 计算机(主板,CPU,内存条,硬盘、显示器)>
圆括弧中的主板,CPU,内存条,硬盘、显示器就是元素“计算机”的子元素。
混合内容
被定义为包含混合内容的元素可以同时包含字符数据和子元素,也可以只包含字符数据
或子元素,依据“元素内容声明”中的定义方式予以判定。其定义规则如下:
<!ELEMENT 元素名(#PCDATA |子元素)*>
在“元素内容声明”中必须使用*号。另外,在“|”线前后必须有空格符。详细的规定
在后面讲述。
元素个数和分组
1.一个或多个元素
当元素由多个子元素组成,并且这些子元素必须出现时,XML 使用逗号“,”作“元素
内容声明”中子元素之间的分隔符,子元素出现的顺序即声明中指定的顺序。其格式如下:
<!ELEMENT 元素名(子元素1,子元素2,……)>
元素重复出现次数
DTD 提供了三个符号,在元素内容声明中用来指定子元素重复出现次数
元素重复符号
符号意义
? 元素不出现或只出现1 次
+ 元素至少出现1 次或任意多次?
* 元素可以不出现或出现任意多次
元素的选择和分组
(1)选择
XML 用管道符“|”作为选择符,在多个可选择元素用管道符分隔时,只允许出现其中
一个
(2)分组
XML 在“元素内容声明”中用圆括弧对作分组符号,例Ex3-5.xml 中,元素声明:
<!ELEMENT 教师(姓名,专业毕业学校,(电话|手机|email))>
其中“电话”、“手机”、“email”就使用圆括弧划分为组,该组使用选择符以便选择任
意一个子元素。
XML 文档中的使用的属性也必须
在DTD 中声明,属性声明的语法格式如下:
<!ATTLIST 元素名属性名称属性类型定义缺省值>
属性声明以<!ATTLIST 开始,其后指定一个需要属性声明的元素名称,在元素名称后
面是需要创建的属性名称。元素名称和属性名称都必须遵循XML 的命名约定。最后是属性
类型声明和缺省值说明。属性声明可出现在DTD 中任意位置,但为了较好的可读性,最好
放在需要该属性的元素声明之后
,XML 文档中的元素也可
以拥有多个属性。为了给一个元素定义多个属性可以采用如下声明方式:
<!ELEMENT 元素名称元素内容>
<!ATTLIST 元素名称
属性名称1 属性类型1 缺省类型
属性名称2 属性类型2 缺省类型
属性名称3 属性类型3 缺省类型
……
属性名称N 属性类型N 缺省类型
>
表3-2 属性类型表
类型 属性取值
CDATA 字符数据
Eval | eval |… 枚举类型
ID 文档中唯一编号类型
IDREF 其他类元素的唯一编号类型
IDREFS 其他唯一编号列表
NMTOKEN 一个合法的XML 名称
NMTOKENS 一个合法的XML 名称列表
ENTITY 一个实体
ENTITIES 多个实体的列表
NOTATION 一个注释的名称
1.CDATA
CDATA(Character Data)类型是最简单、约束最少的数据类型。表示属性取值是字符
数据,可以使用任何字符。
2.枚举类型
枚举类型列出该属性可能选择的所有取值,使用管道符“|”分隔这些值,使用时在列
出的取值中选择一个。
3.ID
ID 类型可用来区分XML 文档中的元素。由于ID 值在整个文档中只能出现一次,并且
元素只能有一个ID 属性,因此,我们利用ID 的唯一性来标识元素。如学生的学号、人事
管理的身份证号、商品编号等。
ID 的属性值必须是合法的XML 名称,即只能以字母、下划线开头,并由字母、下划线、
横线和数字组成的字符串。
ID 属性类型的缺省值必须设置为“#REQUIRED”或“#IMPLED”,不能设置为“#FIXED”
和采用缺省值。
4.IDREF
IDREF 类型引用文档中已存在的ID 属性。通过这种引用,一个元素与XML 文档中的
另一个元素建立了联系。比如户籍管理中的家属关系,以父亲或母亲为家长设置ID 属性,
在元素“子女”中就可以因引用ID 而建立了联系。
IDREFS
IDREFS 指对同一XML 文档中多个ID 的引用,当一个属性引用了多个ID 类型属性值
时,就可以将其定义为IDREFS 类型。使用IDREFS 可以强制检查该属性所列举的每一个值
是否已经在文档的ID 属性中出现。例如,销售商品的商场,其各个销售区、货柜都是按商
品类型划分的,我们使用IDREFS 属性可以包含整个销售区或货柜的商品。同理,在机构人
事管理中,一位科长、处长、部门经理、部长等都会管理数名员工,设置IDREFS 可以反映
这种组织关系
NMTOKEN
NMTOKEN 属性类型规定它的属性取值必须符合XML 的命名规范。在使用Java、C++、
C#、JavaScript 等程序设计语言处理XML 数据时非常有用,因为命名规则相近。
NMTOKENS
NMTOKENS 属性表示其值是由空格分隔的多个NMTOKEN 组成o<?
ENTITY 和ENTITIES
DTD 中,实体是非常有用的。如果属性值要引用实体,对内部实体,可将属性类型定
义为CDATA。ENTITY 属性类型表示属性值必须是一个外部实体。通过外部实体引用,可
以从外部文件取得数据,其典型应用是获取图像文件、文本文件、声音文件。假设人事管理
中,为每个员工建立一份简历文件,并以“.txt”格式保存,可以按如下方式定义和引用。
<!ELEMENT 姓名(#PCDATA)>
<!ATTLIST 姓名简历ENTITY #REQUIRED>
<!ATTLIST 姓名子女IDREF #IMPLIED>
<!ENTITY sti SYSTEM “yuan-gong1.txt “>
ENTITIES 是ENTITY 的复数形式,表示可以引用多个实体.
NOTATION
如果一个属性的值是不可解析的实体,由于XML 解析器无法解析,就必须使用
NOTATION 属性类型指定解析实体的处理程序。当定义属性类型为NOTATION 时,就可以
把已经被定义为标记(NOTATION)的值赋给它。
特殊属性
XML 定义了两个特殊属性:
(1)xml:space
XML 中空格在浏览器上的处理与HTML 一样,只有一个空格有效,多余的空格被忽略。
但是有时空格符是有意义的。HTML 中用<PRE>标记指明按原样保留空格。xml:space 是
XML 文档中定义为#PCDATA 数据类型的一个缺省属性,通过给xml:space 属性赋值为
“preserver”要求应用程序保留全部空格,如果设置为“default”,应用程序忽略重复的空格。
XML 定义了两个特殊属性:
(1)xml:space
XML 中空格在浏览器上的处理与HTML 一样,只有一个空格有效,多余的空格被忽略。
但是有时空格符是有意义的。HTML 中用<PRE>标记指明按原样保留空格。xml:space 是
XML 文档中定义为#PCDATA 数据类型的一个缺省属性,通过给xml:space 属性赋值为
“preserver”要求应用程序保留全部空格,如果设置为“default”,应用程序忽略重复的空格。
(2)xml:lang
xml:lang 是XML 文档中定义为#PCDATA 数据类型的另一个缺省属性。属性值通知处
理程序,XML 文档使用何种语言。xml:lang 与文档声明语句中的encoding 不同,encoding
通知XML 解析器用何种语言来解读XML 文档。xml:lang 属性用于通知文档搜索引擎,以
什么语种来搜索字符串。比如搜索中文字符,则跳过所有非中文标记,这大大加快文档的搜
索速度。
#IMPLED 是属性缺省类型,它表示可有可无,如果元素的属性不一定要出现,即可以
将属性的缺省类型定义为#IMPLED,也可以不设置,但其余三个必须设置。
#REQUIRED 表示属的属性性值必须出现,但这里对属性值的内容不予限制。
#FIXED 表示属性的属性值一定出现并且以固定的内容出现
实体是XML 文档主要的物理机制,作者使用实体来操纵文档的物理结构。比如,高级
语言中的符号常量、宏可以用来代表数据值、代表一个较长字符串、甚至代表某个文件。只
要在声明时重新定义符号常量或宏的描述值,则整个程序或文档中引用符号常量、宏的各个
地方都自然引用重新定义的新值。这大大简化了程序和文档的设计和维护工作。DTD 中的
实体完成类似的功能,XML 文档作者利用实体创建文本的可替换条目
实体是内容的片段,在XML 中,文档、DTD、各种文件(包括图形文件,各种清单等)
都是实体。因此,实体也是将多种不同形态的数据引入XML 文档的简单方法。
由于XML 实体可以完成各种各样的功能,因此它们也呈现几种不同的变化特征,可以
按三种方式划分实体类型:
(1)内部实体或外部实体:内部实体在引用实体的文档内部定义;外部实体由其他文
档中的数据和实体定义。
(2)解析实体或未解析实体:由于图形、图像、声音等二进制文件、Java、C++等语言
的源程序等不能被XML 解析器所解析,代表它们的实体称未解析实体;如果实体声明指定
的内容是符合XML 规范的文本,这样的实体是解析实体。
(3)通用实体或参数实体:通用实体在XML 文档中使用,引用实体时以“&实体名;”
格式进行,即引用实体以&开始,用分号结束;参数实体限定在DTD 文档中使用,引用实
体时以“%实体名;”格式进行。引用实体以%开始,用分号结束;
内部通用实体是内部通用解析实体的简称,所有的内部通用实体都是解析实体,它是最
简单的实体类型,也是应用最广泛的实体类型,在XML 文档的文档类型声明中进行完整的
定义。内部通用实体声明的语法格式是:
<!ENTITY 实体名称实体内容>
内部通用实体声明中,其“实体内容”中是任意不包含“&”、“%”、“””等保留字符的
文本。
XML 内建的五个预定义实体依然起着转义的作用。它们是:
. < 代表小于符号< <<
. > 代表大于符号>
. " 代表双引号““”
. & 代表符号“&”
外部解析实体表明引用的实体对象是一个外部文档,并且该文档符合XML 语法规范,
能够被XML 解析器解析。一旦我们建立了这样的文档,它就可以提供给多个XML 文档使用。外部解析实体简称外部实体。其声明格式是:
<!ENTITY 实体名称SYSTEM | PUBLIC “外部文档的URL”>
外部未解析实体简称未解析实体。未解析实体指不能被XML 解析器解析的实体,主要
是图形图像文件、声音文件等,它必须使用外部的相应应用程序才能解析。因此,未解析实
体的处理分两步进行:
1.标记法声明
<!NOTATION 格式SYSTEM “应用程序URL”>
例如: <!NOTATION bmp SYSTEM “D:\WINNT\System32\mspaint.exe”>
2.未解析实体声明
<!ENTITY 实体名称SYSTEM “文件地址” NDATA 数据类型名>
例如: <!ENTITY poto_lk SYSTEM “photo_lk.bmp” NDATA bmp>
参数实体
1.内部参数实体
DTD 文档内部使用的实体就是参数实体。定义参数实体时,在实体名称前面必须加上
百分号“%”,引用时,在实体名前面也是加“%”。内部参数实体声明格式如下:
<!ENTITY %实体名称实体内容>
引用格式如下:
%实体名称;
2.外部参数实体
内部参数实体仅在本DTD 文档内部使用,其作用有限。如果建立外部参数实体,可被
多个DTD 文档引用。在商品交易系统中,针对同一类商品建立不同的DTD 定义文件,通
过定义外部参数实体来选择它们,将会带来极大的灵活性。外部参数实体的引用与内部参数
实体完全一样,外部参数实体声明语法格式如下:
<!ENTITY %实体名称SYSTEM “DTD 文档URL”
或:
<!ENTITY %实体名称PUBLIC “公共DTD 名称” “DTD 文档URL”>
3.4.5 标记法声明
标记发声明是用自定义符号来识别一个外部未解析实体格式,因此可以把标记法声明看
作格式声明。这种表示法声明实际上说明了未解析实体的数据类型。
标记法声明的格式如下:
<!NOTATION 数据类型名SYSTEM 应用程序地址>
<!NOTATION 数据类型名PUBLIC 应用程序公共名称>
<!NOTATION 数据类型名SYSTEM 应用程序公共名称应用程序地址>
Schema 的引入
DTD 源于SGML,它具有可靠、易于使用的优点,虽然DTD 已经使用了较长时间,但
是它有如下缺陷:
. DTD 基于传统的建模概念,不支持现代设计,如面向对象建模等概念;
. DTD 是针对出版业而设计,其数据类型有限,不适合数据交换和应用程序集成等
应用;
. DTD 的语法与XML 文档不兼容,它有自己的特定语法,因此在使用XML 文档时,
需要掌握两种不同的语法,并且要使用两种互不兼容的解析器分别对DTD 文档和XML 文
档进行解析,然后再利用解析后的DTD 去分析解析后的XML 文档、验证XML 文档的有效
性。由于DTD 不符合XML 文档标准。因此不能使用XML 工具对DTD 进行操作;
. DTD 不支持名域,不能很好解决命名冲突。随着分布式计算中XML 的核心地位的
确立,名域意识已显得日益重要,DTD 越发变得不合时宜。
比较XML Schema 与DTD
与DTD 相比,XML Schema 有如下特点:
. XML Schema(XML 模式)是用XML 语法编写的,与XML 有良好的互操作性,
可以使用相同的工具来处理XML Schema 和其他XML 信息,可通过DOM 接口访问元素和
属性;
. 支持属性分组。例如,有的属性只适合图形元素,而有的属性却适用于所有元素;
. 数据类型丰富,适合数据处理和传输的需要,不仅可以定义文本型数据,还可以定
义整形、浮点型、日期型和布尔型等多种数据类型,并且无需像DTD 一样进行类型转换;
. XML Schema 利用名域将特殊元素与SCHEMA 文档链接,使一个XML 文件可对
应多个SCHEMA 文档;
. XML Schema 是开放的,是可以更新的。用户可以定义自己需要的数据类型、可以
随时更新它的内容模型,而DTD 内容模型是封闭的,不能随意扩充内容,否则无法解析;
. XML Schema 引入了数据类型、名域方便扩充。
目前XML Schema 有两个版本:W3C 的XML Schema 是XSD,其扩展名是“.xsd”。微
软的XML Schema 是XDR,其扩展名是“.xml”。在IE5.0 以上运行时,只能使用扩展名为
“.xml”的文档
名域:
按照W3C 对名域的定义,名域指一组名称的集合,显然在该集合中每一个名称都是唯
一的,绝不会出现重复的现象。
XML 规范采用了一种最简单的方式指定名域:使用URI 作标识符,
并且URI 不必是有效的,它可以不指向任何真实位置(资源)。因为即使我们的计算机没有
与Internet 连接,也应该具有处理XML 文档的能力。使用URI 的目的是保持域名的唯一性,
XML 名域只将它作为字符串处理
XML 名域
由两部分构成:
URI(Uniform Resource Identifier-统一资源标识符),它是区分名域的依据。
前缀(prefix),用以标识元素来自哪个名域,避免了直接使用冗长的URI 或网址做元
素、属性的标识,给名域的使用带来极大的便利。
名域的声明格式如下:
<元素xmlns: 前缀=“URI”>
使用时按如下方式引用:
<前缀:元素>
引用格式表示<URI: 元素>,即URI 下词汇中定义的元素。在名域声明中,等号右边的
名域名是一个URI,但并不强求要访问一个“DTD”或“Schema”文件,仅仅是为了标识一
个特定的名域。当XML 语法分析器检查到名域声明时,就把等号左边的前缀与右边的名域绑
定在一起。对于文档后面使用了该前缀的合法名称都看作是这个名域中定义的。
需要注意,前缀不能使用符号“xml”
和“xmlns”,它们是XML 规范的保留字符。
URI 并非URL(Uniform Resource Locator,统一资源定位符),URI 是更广义的,它包含所有的URL 和URN(Uniform Resource Name,统一资源名),它代表资源的唯一名称。
URL 仅表示根据协议和网络位置来定位资源。
XML 文档中名域的声明有三种:明确声明、缺省声明和混合声明。
明确声明
明确声明的语法格式如下:
<标记码1:标记名称xmlns:标记码1=”名域1 的URI”
xmlns:标记码2=”名域2 的URI”
……
xmlns:标记码N=”名域N 的URI”>
明确声明的语法中,xmlns 是关键字,标记码(即“前缀”)对应的URI 具有唯一性,
可以是虚拟网址。标记名称可以是根元素或子元素标记名称。明确声明方式的使用方法如下:
标记码:标记名称