第三节 XML语言0035

Download Report

Transcript 第三节 XML语言0035

第二章 XML语言
第一节
第二节
第三节
第四节
第五节
第六节
第七节
第八节
XML概述
XML语法
DTD
Schema
Namespace
XSL
XML的应用
其他
如何表示信息?
序号
书名
出版社
出版日期
售价
1
国民党研究续集
中国友谊出版公司
1999-01-01
11.4 元
2
李敖议坛衰思录
中国友谊出版公司
2009-01-01
31.6 元
3
李敖作品精选-为中国思想趋向
求答案
中国友谊出版公司
2001-04-01
2.7 元
4
李敖送电集:李敖著
中国友谊出版公司
2004-01-01
11.4 元
5
李敖有话说.7
中国友谊出版公司
2007-10-30
19.3 元
6
李敖有话说6
中国友谊出版公司
2007-07-01
22.0 元
7
李敖有话说5
中国友谊出版公司
2007-05-11
17.3 元
8
李敖生死书:我们没有明天
中国友谊出版公司
2006-12-01
19.8 元
9
只爱一点点:从万宝囊到臭屎堆
中国友谊出版公司
2006-12-01
9.9 元
10
李敖有话说4
中国友谊出版公司
2006-08-01
24.6 元
如何表示信息?
如何表示信息?
计算机可读懂的信息表示
TCP/IP格式
计算机与人均可读的信息表示
<books>
演示:http://sru.las.ac.cn/SRW/
<book>
<title>国民党研究续集</title>
<publisher>中国友谊出版公司</publisher>
<date>1999-01-01</date>
<price>11.4 元</price>
</book>
<book>
<title>李敖议坛衰思录</title>
<publisher>中国友谊出版公司</publisher>
<date>2009-01-01</date>
<price>31.6 元</price>
</book>
<book>
<title>李敖有话说</title>
<publisher>中国友谊出版公司</publisher>
<date>2007-01-01</date>
<price>11.4 元</price>
</book>
</books>
 http://sru.las.ac.cn/SRW/services/DEIS?query=cql.any+%3
D+%22system%22&version=1.1&operation=searchRetrie
ve&recordSchema=info:srw/schema/1/dcv1.1&recordPacking=xml&stylesheet=/SRW/dbase/DEIS/
searchRetrieveResponse_csdl.xsl
 http://sru.las.ac.cn/SRW/services/DEIS?query=cql.any+%3
D+%22system%22&version=1.1&operation=searchRetrie
ve&recordSchema=info:srw/schema/1/dcv1.1&recordPacking=xml&stylesheet=/SRW/dbase/DEIS/
searchRetrieveResponse.xsl
第一节、XML概述
XML介绍
XML的组成
XML介绍
XML: eXtensible Markup Language
中文译为“可扩展标记语言”,是用
于标记电子文件使其具有结构性的标
记语言。
是SGML(Standard generalized markup
language) 的一子集.
 标记
读书时,为了突出重点,可以用彩色笔把
某些句子加亮,或者下划线。
文字编辑器借助置标来定义格式与外观
通信程序依靠置标理解所传输信息的语意
数据库通过置标来将数据字段与一定的含
义相连,并表明字段之间的关系
标记语言
一种用来给文本添加标记的语言。
置标
用标记语言对数据进行编码的过程。
GML(Generalized Markup Language)
2 0世纪6 0年代,I B M公司创建了第
一个标识文档的通用标记语言GML。
最初,GML只被用于IBM内部文档。
SGML
随着众多企业采用GML,它被扩展为标准通用标记语言SGML
(Standard Generalized Markup Language)。
1986年,国际标准化组织把SGML确定为ISO
 http://www.iso.org/
SGML特点
 SGML包含一系列的文档类型定义(简称DTD)
 SGML是可以扩展;
 SGML十分复杂,不易学习使用,计算机实现也十分困难。
HTML
1989年,欧洲核子物理研究中心在SGML基础上提出
HTML(HyperText Markup Language )。
HTML包含一组事先定义好的标签,每个标签表明
一定的显示格式。
–例如:<html><body><head><table><hr>…
被置标后的HTML文件,同时包含文本及文本显示
格式信息。
HTML文件由专门处理工具进行读取、显示。
HTML
特点
HTML只使用SGML中很小一部分标签
HTML规定的标签是固定的,不可扩展,它不需
包含DTD。
HTML简单、易学易用
HTML使 Web 技术从计算机界走向千家万户
从SGML到HTML,从MARC到DC,从Z39.50到SRU
W3C推出精简SGML—XML
HTML过于简单的语法无法表现复杂的形式,
不能满足不断增长的需求。
SGML太庞大,用户学、用不方便,且要全
面实现SGML的浏览器又非常困难。
XML
XML是一种比HTML更强大的标记语言
XML同样依赖于描述一定规则的标签和能够读懂
这些标签的处理工具。
XML是可扩展的标记语言
 与HTML事先定义好固定标签不同,XML提供一个标签标
准,用户可以根据实际需要自行定义新的标签。
XML目标
在互联网上直接使用(类似于HTML)。
支持各种不同的应用方式(浏览、内容分析)。
与SGML兼容(SGML是XML的直接先驱)。
处理XML文件的应用程序应该容易编写。
XML文件具有良好的可读性(HTML的易读性很差)。
用XML设计新的标记语言应该方便快捷(不必再去经历标准制
定程序)
XML文件应该容易编制(借助普通编辑工具就能编写)。
XML标记的简洁性并不重要(不必再去费尽心机减少标记)。
XML
1998年XML1.0成为W3C推荐标准
http://www.w3.org/TR/1998/REC-xml-19980210
XML 1.0 (Fifth Edition)
http://www.w3.org/TR/REC-xml/
第一节、XML概述
XML简史
XML组成
XML的优点
XML文档组成
三部分
标记描述 ——XML数据文件(.XML)
置标语法 ——DTD/Schema文件(.DTD/.XSD)
置标含义 ——XSL文件(.XSL)
DTD/XSD
XSL
理解结构
XML
获得语义
XML标记描述
分两类
一类偏重于语意描述
XML看上去和HTML非常相象,但XML标签具有语义,
支持相关工具的语义解析。
一类偏重于显示方式描述,包括:
文本描述
矢量图形、图象、声音描述等
XML标记文档实例
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE list SYSTEM “contact.dtd">
<联系人列表>
<联系人>
<姓名>张三</姓名>
<ID>001</ID>
<公司>A公司</公司>
<email>[email protected]</email>
<电话>(010)62345678</电话>
<地址>
<街道>五街1234号</街道>
<城市>北京</城市>
<省份>北京</省份>
<ZIP>100001</ZIP>
</地址>
</联系人>
…….
</联系人列表>
置标语法
DTD(Document Type Definition)
置标语法是通过文件类型定义DTD来描述
的,即通过DTD来描述什么是有效的标签。
DTD语法定义文件与XML数据标记文件是分
离的。
XML标记文档:list.xml
<?xml version="1.0" encoding=" GB2312 " ?>
DTD文档:contact.dtd
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE list SYSTEM “contact.dtd">
<list>
<联系人>
<姓名>张三</姓名>
<ID>001</ID>
<公司>A公司</公司>
<email>[email protected]</email>
<电话>(010)62345678</电话>
<地址>
<省份>北京</省份>
<城市>北京</城市>
<街道>五街1234号</街道>
</地址>
</联系人>
</list>
<!ELEMENT list (联系人)*>
<!ELEMENT 联系人 (姓名,ID,公
司,email,电话,地址)>
<!ELEMENT 地址 (省份,城市,街道)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT 公司 (#PCDATA)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT 电话 (#PCDATA)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>
置标含义
样式单(Style Sheet)
为明确各个标签含义,XML使用样式单来
向应用程序提供如何处理显示的指示说
明。
样式单实例
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl=http://www.w3.org/TR/WD-xsl …>
<xsl:template><xsl:apply-templates/></xsl:template>
<xsl:template match = "/">
<HTML> <HEAD><TITLE>F公司的客户联系信息</TITLE>
</HEAD><BODY> <xsl:apply-templates select="联系人列表
"/></BODY></HTML>
</xsl:template>
<xsl:template match = "联系人列表">
<xsl:for-each select="联系人">
<UL>
<LI><xsl:value-of select="姓名"/></LI>
<UL>
<LI>用户ID:<xsl:value-of select="ID"/></LI>
<LI>公司: <xsl:value-of select="公司"/></LI>
<LI>EMAIL: <xsl:value-of select=“email"/></LI>
<LI>电话: <xsl:value-of select="电话"/></LI>
</UL>
</UL>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
 将XML文档中的<姓名>
标签转换为HTML中的
<UL>标签;
 将XML文档中的 <ID>、<
公司>、<email>、<电话>
等标签转换为HTML中的
< LI>标签。
XML应用体系结构
Application
SAX
XSL
XML Namespace
DOM
XPath
XML Specification
DOM4J
XLink
XML Schema
(DTD)
XML核心内容
• XML Specification: http://www.w3.org/TR/2006/REC-xml-20060816/
W3C推荐标准,定义XML基本语法规范
•XML Namespace: http://www.w3.org/TR/REC-xml-names/
提供一种统一命名XML文档中的元素和属性的机制,避免来自不同标记
词汇表的元素和属性之间冲突。
•XML Schema:http://www.w3.org/XML/Schema
用于定义和描述XML文档结构和内容模式,定义元素和元素之间的关系,
定义元素和属性的数据类型。
第一节、XML概述
XML简史
XML组成
XML的优点
XML的优点
可以自由地制定自己的置标语言
不必由有关的组织认可,不必开发专用
的浏览器;
允许各个组织、个人建立适合他们自己
需要的标记库,并且,这个标记库可以
迅速地投入使用。
XML的优点
从语义层次进行描述
便于修改
便于检索
便于处理
遵循严格的语法要求
o 便于书写、阅读
o 便于借助工具自动化处理
XML的优点

便于不同系统之间信息传输
o
可以标注多种信息类型

文字、图像、二进制文件等
<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD
SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/
svg11.dtd">
<svg mlns="http://www.w3.org/2000/svg"
version="1.1" width="467" height="462">
<rect x="80" y="60" width="250"
height="250" rx="20" fill="red"
stroke="black" stroke-width="2px" />
<rect x="140" y="120" width="250"
height="250" rx="40" fill="blue"
stroke="black" stroke-width="2px" fillopacity="0.7" />
</svg>
XML的优点
 具有较好的保值性
XML的保值性来自SGML语言,SGML最
初设计目标是要为文件提供50年以上寿命。
电子文档的虽然能长期保存,但也存在隐
患,处理软件升级导致打开文档的困难性。
 如五十年以后,人们可能没有工具去打开用
Word97写的文档。
XML与HTML的比较
比较内容
HTML
XML
可扩展性
不具有扩展性
支持定义新的置标语言
侧重点
如何表现信息
如何结构化地描述信息
不要求标记的嵌套、配对等
严格要求嵌套、配对,和遵循DTD
的树形结构
可读性及可维护性
难于阅读、维护
结构清晰,便于阅读、维护
数据和显示的关系
内容描述与显示方式整合为一体
内容描述与显示方式相分离
不具有保值性
具有保值性
比较多
相对少
语法要求
保值性
编辑及浏览工具
第二章 XML语言
第一节
第二节
第三节
第四节
第五节
第六节
第七节
第八节
XML概述
XML语法
DTD
Schema
XML命名空间
XSL
XML的应用
其他
第二节 XML语法
XML规则
逻辑结构
物理结构
参考资料:
XML Specification
(http://www.w3.org/TR/REC-xml/)
XML规则
基本规则
XML文档是由 Unicode 字符集组成的纯文本文档。
XML 文档具有良好结构。
XML文档区分大小写。
标记之间信息构成字符数据。
XML处理器不关心字符数据。
XML可为各种对象、应用程序定义语法和文件格式。
XML规则
格式良好性规则
XML 文档结构定义
遵循XML 规范
– 基于XML Specification规范构建的 XML 文档被
称为“具有良好格式的 XML文档”。
自定义
– 由文档作者自行创建结构文档 “DTD”或“XML
Schema”;
– XML 处理器按照这个文档中的定义规则进行检
验。
XML规则
格式良好性规则
(1)有且仅有一个根元素。
 根元素也称文档元素,整个 XML 文档的其他元素都包
含在根元素中,并通过嵌套形成树型结构。
 除了根元素外,其他元素都是子元素。
(2)每个元素必须有开始标记和结束标记
 开始标记的格式是:<标记名称>
 结束标记的格式是:</标记名称>
 空元素标记:<元素/>
XML规则
 格式良好性规则
(3)元素必须正确嵌套
 元素嵌套时不允许交叉,最先出现开始标记的元素,其结束标记
最后出现。
<element1>
<element2>
…
<element2>
<element1>
(4)所有属性值必须放在双引号或单引号中。
– <title language=“中文”>
(5)如果文档没有 DTD,在缺省情况下,所有属性值的类型必
须是“CDATA”。
XML规则
有效性规则
如果 XML 文档中元素出现的个数、顺序以
及元素包含的内容都符合 DTD或XML
Shema规则,则该文档就是有效的。
一个 DTD 或 XML Shema 可以被多个XML
文档共享,既保证了 XML 文档结构的标准
化,又大大减少编写代码的工作负担。
XML
DTD
XML规则
命名规则
所有 XML命名都必需以字母、下划线或冒
号开头。
用作命名空间时才以冒号做分隔符。
如: dc:title
保留字用户不使用
如:“ XML”、“xml”
第二节、 XML的语法
XML规则
逻辑结构
物理结构
XML文件的逻辑结构
XML 文档组成
文档头部
 声明
 注释
 处理指令
 文档类型定义
文档主体
 由一个或多个元素组成;
 每个元素可以有子元素。
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet href=“list.xsl"?>
<联系人列表>
<联系人>
<姓名>张三</姓名>
<ID>001</ID>
<公司>A公司</公司>
<email>[email protected]</email>
<电话>(010)62345678</电话>
…
</联系人>
…
</联系人列表>
XML实例
[1] <?xml version="1.0" encoding="GB2312" ?>
[2]<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>
[3] <专有名词列表>
[4] <专有名词>
[5]
<名词>XML</名词>
[6]
<解释>XML是一种可扩展的源置标语言,
它可用以规定新的置标规则,并根
据这个规则组织数据 </解释>
[7]
<示例>
[8]
<!-- 一个XML的例子 -->
[9]
<![CDATA[
[10]
<联系人>
[11]
<姓名>张三</姓名>
[12]
<EMAIL>[email protected]</EMAIL>
[13]
</联系人> ]]>
[14]
</示例>
[15] </专有名词>
[16]</专有名词列表>
说明
[1]-[2] 是序言
[3]—[16] 是文件中的各
个元素。
[5]行:“<名词>”“</名词>”
是标记,“XML”是字符
数据。
[8] 是注释
[9]—[13] 是CDATA
XML文档头部
文档头部可以包括
声明
注释
处理指令
文档类型定义
XML文档头部
(1)XML 声明
一个 XML 文档通常以一个XML声明开始,它指明
XML版本等信息,必须出现在XML文档的第一行。
<?xml version="1.0" encoding="UTF-8" ?>
XML声明的作用就是告诉XML处理程序:“当前文件
是按照XML标准对数据进行置标的”。
XML文档头部
(1)XML声明
语法格式
<?xml version=verID encoding=codeID standalone=value ?>
实例
<?xml version = "1.0"
standalone = "no"
encoding
= "GB2312"?>
XML文档头部
(1)XML声明
属性
 Version:必备属性
–XML版本号,必须在属性列表中排在最前列。由于当前的XML
最新版本是1.0,所以:version = “1.0”
 Standalone:可选属性
–表明该XML文件是否还有一个配套置标声明文件
–Standalone=“yes”:表示没有配套的DTD文件;
–Standalone=“no”,可能有这样一个文件(也可能没有)
–缺省为: Standalone=“no”
 Encoding:可选属性
–表明XML文档使用的字符编码标准,常见的有:
简体中文码:GB2312
繁体中文码:BIG5
西欧字符: UTF-8
XML文档头部
(2)处理指令(PI,Processing Instruction)
指导应用程序如何处理XML文件,格式:
〈?处理指令名 处理指令信息 ?〉
用于连接CSS样式单的PI格式
<?xml-stylesheet
href=“http://las.ac.cn/cbase.css"
type="text/css" ?>
用于连接XSL样式单的PI格式
<?xml-stylesheet
href=“http://las.ac.cn/xbase.xsl "
type="text/xsl" ?>
XML文档头部
(3)注释
XML 中使用注释对文档进行解释说明,增
加程序的可读性,处理程序不对注释标记的
内容进行处理。
语法
<!-- 注释文字 -->
XML文档头部
(3)注释
使用注释规则
注释不能出现在声明之前
注释可以包容标记,使标记失去作用
注释不能出现在标记中
注释内容中不能包含“--”
以下是合法注释:
<!--<ElementType name=“学生档案信息”
content="eltOnly " model="closed"> -->
XML文档头部
(4)文档类型定义
语法:<!DOCTYPE …>
要求:文档类型定义必须出现在根元素标记符前面。
实例:
<?xml version=“1.0”?>
<!DOCTYPE 联系人列表 [
<!ENTITY A公司地址 “北京市五街1234号”>
<!ENTITY B公司地址 “上海南京路9876号”〉
]>
<联系人列表>
<联系人>
<姓名>张三</姓名>
</联系人>
</联系人列表>
文档主体
文档主体组成
一个文档元素(根元素)
多个子元素
也可以有 PI 和注释
元素
XML元素
一个元素包含一个起始标记、一个结束标记以及标记之间的
数据内容。
<标记〉数据内容〈/标记〉
元素中还可以再嵌套子元素,例如:
<联系人列表>
<联系人>
<姓名>张三</姓名>
…
</联系人>
</联系人列表>
元素标记
元素标记
基本形式
<标记名 [属性名=“属性取值”]>
例如: <title language=“中文“>
 元素标记命名规则
(1)以字母或下划线开头,后跟字母、数字、下
划线、横线和圆点等,不能包含空格,不能以字符
串“xml”作为开头。
 下面是合法的XML标记名称:
–<city.stree> 、<myfile-name> 、<content_11>
 下面是非法的XML标记名称:
–<city street>
–<11_content>
–<tody&one>
有空格
以数字开头
有非法字符”&”
(2)标记是大小写敏感的
–<Character>
–<character>
–<CHARACTER>
 空元素标记
正常方式
<IMG src="d:\direct\public\flawer.jpg"></IMG>
简便方式
<IMG src="d:\direct\public\flawer.jpg"/>
元素属性
XML元素属性
属性不影响元素树型结构、并提供附加的上下文。
属性格式:
<元素标记名 属性名1=“属性值1” 属性名2=“属性值2”…>
例如: <title language=“中文“>
元素属性举例:
<?xml version="1.0" encoding="gb2312"?>
<计算机系学生登记表>
<学生 学号=“1236”
<学生 学号=“0694”
<学生 学号=“6288”
<学生 学号=“5864”
</计算机系学生登记表>
性别=“女”>王芳</学生>
性别=“男”>李奇</学生>
性别=“男”>黄昂扬</学生>
性别=“女”>文笛声</学生>
属性定义规则
标记中可以使用多个属性,但属性名称不得重复;
属性名是大小写敏感的;
属性只能出现在起始标记或空标记中;
属性值必须用引号(英文);
少用属性,尽可能用子元素。因为属性有以下缺陷:
 属性值不能包含多重数值,但是元素可以;
 属性值很难扩展;
 属性不能描述结构内容,但是元素可以;
 属性值很难通过 DTD 进行测试。
字符数据
字符数据
在起始和结束标记之间出现的字串信息为字符数据。
<姓名>张三</姓名>
以下是两条不同的字符数据:
<格式>一段文字</格式>
和:
〈格式>
一段文字
〈/格式>
后者的文本数据比前者多了两个换行符。
字符数据可以是任何合法的UNICODE字符,但不能包含
“<”、 ”>”等特殊字符。
字符数据
特殊字符数据表示法一:实体引用
为了在字符数据和标记中使用一些特殊符号,XML提供了实体
引用法:
特殊字符
实体引用
>
&gt;
<
&lt;
&
&amp;
"
&quot;
’
&apos;
字符数据
举例
数据中的特殊字符
 字符数据内容:“加入A>B,则B一定是偶数”
 正确XML表示形式:
<示例>加入A&gt;B,则B一定是偶数</示例>
属性值中的特殊字符
 错误写法:
<STATEMENT VALUE = "She said, "Don’t go there!"">
 正确写法:
<STATEMENT VALUE = "She said, &quot;Don&apos;t go
there!&quot;">
字符数据
特殊字符数据表示方法二:CDATA
格式
<![CDATA[
文本内容
]]>
CDATA文本内容中是不能出现字符串“]]>”,
因为它代表了CDATA数据块的结束标志。
CDATA下所有内容都被当作字符数据看待。
字符数据
CDATA与实体引用比较
CDATA表示方式
<示例><![CDATA[<姓名>张三</姓名>]]></示例>
实体引用表示方式
<示例>&lt;姓名&gt;张三&lt;/姓名&gt;</示例>
注释
 XML注释
用“<!--”和“-->”引起来
可以是多行,但不允许出现嵌套
字符串“--”、“<”和“>”不能出现在注释中
例子:
<名词列表>
<!-<名词>HTML</名词>
<名词>XHTML</名词>
<名词>SGML</名词>
-->
<名词>XML</名词>
</名词列表>
第二节、 XML的语法
XML基本规则
逻辑结构
物理结构
XML文件的物理结构
什么是实体
一个 XML 文件可能由一个或多个存储单元组成,
它们被称为实体(entity),它们都具有内容并且都
用名字进行标识。
 类似程序设计中的变量,每个变量可存放一定数据。
实体充当着和别名类似的角色,一个简单的实体名
称可以用来代表一大段文本内容。
实体类型:
 一般实体
 参数实体
实体声明
一般实体声明—内部实体
<!ENTITY 实体名 “文本内容”〉
例如
<!ENTITY lettersign
“张三
某网络公司销售部门
北京市海淀区中关村88号,100000”〉
实体声明
一般实体声明—外部实体
<!ENTITY 实体名 SYSTEM “地址”〉
例如:
<!ENTITY lettersign
SYSTEM "http://www.mydomain.com/lettersign.xml"〉
实体声明
 参数实体
参数实体的格式与一般实体很类似,只不过中间
要加上“%”符。
<!ENTITY % 实体名 "文本内容"〉
参数实体既可以是内部的也可以是外部的,参数
实体只用在DTD中。
实体声明
实体声明规则
实体声明应该放在文件类型DOCTYPE中。DOCTYPE一
般放在文件头之后、XML元素之前。
例如:
<?xml version=“1.0”?>
<!DOCTYPE 文件根元素名 [
<!ENTITY NSLAddress “北京北四环西路33号”>
]>
<文件根元素名>
…
</文件根元素名>
实体引用
指引用一个已经声明过的实体。
一般实体引用形式:
&实体名;
例如:
<地址>&NSLAddress;</地址>
参数实体引用形式:
%实体名;
例如:
<![%short;[
<!ELEMENT memory (media | subdate | subject+)* >
]]>
实体引用
实体引用规则
被引用的实体必须已经在XML文件中声明过;
实体引用中不能出现空格:
错误引用:& lettersign;和&lettersign ;
在一个实体中可以再引用其它实体,但是不能出现循
环引用。
实体引用不能在DOCTYPE声明中出现。
一般实体声明和引用例子
<?xml version=“1.0”?>
<!DOCTYPE 联系人列表 [
<!ENTITY A公司地址 “北京市五街1234
号”>
<!ENTITY B公司地址 “上海南京路9876
号”〉
]>
<联系人列表>
<联系人>
<姓名>张三</姓名>
<公司>A公司</公司>>
<地址>&A公司地址;</地址>
</联系人>
<联系人>
<姓名>李四</姓名>
<公司>B公司</公司>
<地址>&B公司地址;〈/地址〉
</联系人>
</联系人列表>
实体声明
实体引用
参数实体声明与引用实例
<!ENTITY % short "IGNORE">
实体声明
<!ELEMENT memories (memory)* >
<!-- Short form -->
<![%short;[
<!ELEMENT memory (media | subdate | subject+)* >
]]>
<!ATTLIST memory tapeid IDREF #REQUIRED>
<!ELEMENT subdate (#PCDATA) >
<!ELEMENT subject (#PCDATA) >
<!ELEMENT media EMPTY >
实体引用
实体引用
实体引用规则
实体引用不仅可以出现在字符数据中,还可
以出现在标记的属性中。
例如:
<联系人 公司=“B公司” 地址=“&B公司地址;”>
属性中实体引用规则:
在标记属性中不能引用一个外部实体。
引用的文本中不能出现字符“<” 。
第三节 DTD
第三节 DTD
DTD基本结构
定义元素及其后代
定义元素属性
DTD基本结构
DTD
Document Type Definition
规定XML文档的逻辑结构,主要是来描述
XML文件中元素的格式。它可以定义文档
的语法,以便支持XML语法分析程序根据
DTD确认某个XML页面标记的合法性。
DTD基本结构
DTD特点
DTD描述了一个置标语言的语法和词汇表,即定
义了XML文件的整体结构及语法。
编辑工具根据 DTD中定义的结构创建XML文档
XML解析器利用DTD定义验证文档的有效性。
DTD可以非常简单,仅仅列出所有有效的元素
DTD也可以非常复杂,除元素,还可以指出元素
之间的关系。
DTD的基本结构
DTD特点
DTD中的关键字都必须是大写的
例如:ELEMENT、ATTLIST、#REQUIRED、
#IMPLIED、NMTOKEN、ID等等。
DTD所定义的元素和属性名是大小写敏感
例如 “BOOKS”和“Books”并不相同。
DTD的基本结构
DTD类型
内部DTD
外部DTD
公用DTD
内部DTD
内部DTD
DTD定义的信息放在XML文档中,加在XML文件头部,
结构如下:
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 根元素名[
元素描述
]>
<?xml-stylesheet type="text/xsl" href=""?>
.....
内部DTD实例
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 (联系人)*>
<!ELEMENT 联系人 (姓名,公司, 电话,地址)>
<!ELEMENT 地址 (城市,街道)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT 公司 (#PCDATA)>
<!ELEMENT 电话 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 街道 (#PCDATA)>
]>
<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>
<联系人列表>
<联系人>
<姓名>张三</姓名>
<公司>A公司</公司>
<电话>(010)62345678</电话>
<地址>
<城市>北京市</城市>
<街道>五街1234号</街道>
</地址>
</联系人>
…
</联系人列表>
外部DTD
什么是外部DTD
DTD信息保存在XML文件之外的一个独立文件中。
优点
 多个XML文件共享一个共用DTD文件
 简化输入,改动DTD不用一一去改每个XML文件
缺点
 如果DTD的改动不是“向后兼容”的,这时原先写的
那些XML文件可能就会出问题。
外部DTD
外部DTD引用
XML声明中必须说明这个文件不是自成一体的,即
standalone属性值应该是“no”。
<?xml version = "1.0"
encoding="GB2312"
standalone = "no"?>
在DOCTYPE声明中,要加入SYSTEM属性:
<!DOCTYPE 根元素名
SYSTEM "外部DTD文件的URL">
外部DTD
例子
<!DOCTYPE 联系人列表 SYSTEM
"http://www.mydomain.com/dtds/fclml.dtd">
URL可以是绝对路径,也可以是相对路径
<!DOCTYPE 联系人列表 SYSTEM "fclml.dtd">
公共DTD
什么是公共DTD
以关键字PUBLIC而不是SYSTEM来引用一个由权威机
构制订的、提供给特定行业或公众使用的DTD,这
个外部DTD还需要得到一个标识名。
公共DTD的引用形式
<!DOCTYPE 根元素 PUBLIC "DTD名称" "外部DTD的URL">
 例如
<!DOCTYPE 联系人列表 PUBLIC "联系人DTD"
"http://www.mydomain.com/dtds/fclml.dtd">
第三节 DTD
DTD基本结构
定义元素及其后代
定义元素属性
 DTD 规范内容
1.
2.
3.
4.
5.
DTD 声明
元素的定义规则及相关信息
属性的种类及其使用
定义元素之间的关系、元素的排列方式
定义实体机制及其引用
元素类型声明
 声明XML文件的根元素、文件内容和结构
使用元素类型声明( ETD)来声明所有元素。
 定义元素名字、类型
 一个XML元素可以为空,也可以是一段纯文本,还可
以有若干个子元素,而这些子元素同时又可以有它
们的子元素。
DTD通过元素之间的父子关系,描述整个文件
的结构关系。
元素类型声明
ETD格式
<!ELEMENT 元素名 元素内容描述>
例如:
<?xml version = “1.0” encoding=“GB2312” standalone =
“yes”?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
]>
<联系人列表>
纯文本信息说明联系人信息
</联系人列表>
元素类型声明
 其他元素
为了使元素“联系人列表”中还可以包含其它元素,还需要
定义元素“联系人”和“姓名”。例如:
<?xml version = “1.0” encoding=“GB2312” standalone = “yes”?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名)>
<!ELEMENT 姓名(#PCDATA)>
]>
<联系人列表>
<联系人>
<姓名>张三</姓名>
</联系人>
</联系人列表>
•根元素名为“联系人列表”;
•“联系人列表”中可以包含子
元素“联系人”,也可以包含任
何纯文本数据 (这即是ANY的
含义) ;
•“联系人”元素有且只有一个
自己的子元素“姓名”;
•“姓名”元素只能包含纯文本
数据(即(#PCDATA))
元素类型声明
错误的例子:
<?xml version = “1.0” encoding=“GB2312”
standalone = “yes”?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
]>
<联系人列表>
<联系人>
<姓名>张三</姓名>
</联系人>
</联系人列表>
“联系人”、
“姓名”元素
没有定义。
元素类型声明
注意事项
除了根元素外,在定义其它元素时使用关键字ANY都是
不好的习惯,让人不知所措
在定义元素时,ETD的顺序是无关紧要的。因此:
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名)>
和
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名)>
<!ELEMENT 姓名(#PCDATA)>
所定义的文件结构是完全相同的
元素类型声明
注意事项
不能对不同的元素使用相同的元素名。
例如:
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名)>
<!ELEMENT 联系人(EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
在这个例子中,对“联系人”的重复定义,会引
起错误。
定义元素及其子元素
举例
下例中,我们定义了一个名为“联系人”的元素,它包含一
个单独的子元素“姓名”,“姓名”元素包含字符数据:
<?xml version = “1.0” encoding=“GB2312” standalone = “yes”?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名)>
<!ELEMENT 姓名(#PCDATA)>
]>
<联系人列表>
<联系人>
<姓名>张三</姓名>
</联系人>
</联系人列表>
定义元素及其子元素
DTD支持灵活的元素定义
DTD可以对一个元素作如下任何一种类型的
定义:
有一个子元素;
有一个或多个子元素
有零个或多个子元素
至少有一个子元素
有一个或多个子元素Y,或一个子元素Z。
不要求顺序的子元素
空格分离的元素不限顺序
如DTD:
<!ELEMENT 联系人(姓名 EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
有效的XML:
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
有效的XML:
<联系人>
<EMAIL>[email protected]</EMAIL>
<姓名>张三</姓名>
</联系人>
要求顺序的子元素
逗号“,”分隔元素要求顺序
DTD:
<!ELEMENT 联系人(姓名, EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
有效XML:
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
无效XML:
<联系人>
<EMAIL>[email protected]</EMAIL>
<姓名>张三</姓名>
</联系人>
重复元素
 “+”:重复元素
DTD:
<!ELEMENT 联系人(姓名,EMAIL+)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
说明
 一个“联系人”元素中必须含有一个“姓名”元素,后面接一个
或多个“EMAIL”元素。
有效XML
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
<EMAIL>[email protected]</EMAIL>
<EMAIL>[email protected]</EMAIL>
</联系人>
重复元素
 “*”:“零个或多个”元素
DTD
<!ELEMENT 联系人(姓名,EMAIL*)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
有效XML
<联系人>
<姓名>张三</姓名>
</联系人>
或者
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
<EMAIL>[email protected]</EMAIL>
</联系人>
成组元素
 括号:元素组
DTD
<!ELEMENT 联系人(姓名,EMAIL)+>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
说明
 子元素可以使用括号并为一组。
 上面DTD片段说明,一个“联系人”元素中可以有一
个或多个“姓名/EMAIL”子元素对,并且在每个子元素
对中,“姓名”都放在“EMAIL”之前。
有效XML
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
<姓名>王五</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
OR或
符号“|”:任选一
DTD规定:
<!ELEMENT 联系人(姓名,(电话|EMAIL))>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 电话(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
 所有的“联系人”元素应该有一个“姓名”子元素,之后
还应该有一个“电话”或一个“EMAIL”元素,但不能同时
有“电话”和“EMAIL”两个元素。
下面是无效XML(因为缺少电话或EMAIL)
<联系人>
<姓名>张三</姓名>
</联系人>
OR或
符号“|”:任选一
DTD规定:
<!ELEMENT 联系人(姓名,(电话|EMAIL))>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 电话(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
下面还是无效XML(因为不能同时有电话和EMAIL)
<联系人>
<姓名>张三</姓名>
<电话>12345678</电话>
<EMAIL>[email protected]</EMAIL>
</联系人>
OR或
符号“|”:任选一
DTD规定:
<!ELEMENT 联系人(姓名,(电话|EMAIL))>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 电话(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
下面还是无效XML(姓名应放在EMAIL前)
<联系人>
<EMAIL>[email protected]</EMAIL>
<姓名>张三</姓名>
</联系人>
OR或
 符号“|”:任选一
DTD规定:
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
联系人(姓名,(电话|EMAIL))>
姓名(#PCDATA)>
电话(#PCDATA)>
EMAIL(#PCDATA)>
有效XML文件
<联系人>
<姓名>张三</姓名>
<电话>12345678</电话>
</联系人>
或者是:
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
OR或
注意事项
在一个组中,只允许使用一种连接符(例如
“,”或“|”)。下面DTD是不合法的:
<!ELEMENT 联系人(姓名,电话|EMAIL)>
要想使用多种连接符,只有通过创建子元素
组的方式,例如:
<!ELEMENT 联系人(姓名,(电话|EMAIL))>
可选子元素
符号“?”:可选子元素
例如:
<!ELEMENT 联系人(姓名,(电话|EMAIL),地址?)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 电话(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ELEMENT 地址(街道,城市,省份)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>
上面DTD定义:
每一个“联系人”都必须有一个“姓名”子元素,同时或者
有一个“电话” 或者有一个“EMAIL”子元素,此外,它还可
以包含一个“地址”子元素,也可以不包含这个元素。
可选子元素
 符号“?”:可选子元素
<!ELEMENT 联系人(姓名,(电话|EMAIL),地址?)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 电话(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ELEMENT 地址(街道,城市,省份)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>
 有效XML
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
<地址>
<街道>五街1234号</街道>
<城市>北京市</城市>
<省份>北京</省份>
</地址>
</联系人>
或者
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
混合内容
 在一个元素中既包含子元素,也包含纯文本。例如:
<?xml version = “1.0” encoding=“GB2312” standalone = “yes”?>
<!DOCTYPE 联系人列表 [
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名,电话,EMAIL,#PCDATA)*>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 电话(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
]> <联系人列表>
注意
<联系人>
<姓名>张三</姓名>
<电话>(010)62345678</电话>
由于在“(姓名,电
<EMAIL>[email protected]</EMAIL>
话,EMAIL,#PCDATA)”之
这是关于张三的信息
外有“*”,所以在元素
</联系人>
</联系人列表>
“联系人”中可以包含零
个或多个“姓名”、电话、
EMAIL和纯文本字段。
空元素
空元素
一个元素中不包含任何子元素,也不包含纯
文本。
格式:
EMPTY
<!ELEMENT HR EMPTY>
说明:在XML文件中可以使用一个元素:
<HR/>
定义元素及其子元素
正则表达式
元 字 符
含
义
+
出现一次或多次
*
出现零次或多次
?
可选,不出现或出现一次
()
一组要共同匹配的表达式
|
OR,或
,
AND,要求严格遵从顺序要求
元素A
元素B
元素C
元素列表,无须遵从顺序要求
第三节 DTD
DTD的基本结构
定义元素及其后代
定义元素属性
如何定义元素的属性
属性实例
假如在XML文档中,“商品”元素有两个
属性:“类型”、“颜色”:
<商品 类型 = “服装” 颜色 = “黄色”>
如何定义元素的属性
 DTD属性定义格式:
<!ATTLIST 元素名 (属性名 属性类型 缺省值)*>
例子:
<!ATTLIST 商品
类型 CDATA #REQUIRED
颜色 CDATA #IMPLIED
>
元素名:
 属性所属的元素名字,上面例中元素名是“商品”
属性名:
 上例中属性名分别为“类型”、“颜色”
属性类型:
 指定该属性是属于十个有效属性类型中的哪种类型
缺省值:
 如果没有指定值,语法分析器默认它具有的取值
如何定义元素的属性
注意事项
ATTLIST是一个属性的列表,它可以包含多
个属性。
同一属性可以多次声明,首先执行第一个。
一些元素带有多个属性,通过多个声明实现
属性缺省值
 属性的缺省值可分三类
REQUIRED:必须赋值的属性
说明XML文件中必须为这个属性给出一个属性值。
IMPLIED:属性值可有可无的属性
文法解释器不再强行要求你在XML文件中给该属性赋值,而且
也无须在DTD中为该属性提供缺省值。
FIXED:固定取值的属性
为一个特定的属性提供一个缺省值,并且不希望XML文件的编
写者把缺省值替代掉。
定义缺省值的属性
如果不使用上面任何一种关键字来定义属性,需要在DTD中为
它提供一个缺省值。而在XML文件中可以为该属性给出新的属
性值来覆盖事先定义的缺省值。
属性定义实例
<!ATTLIST 页面作者
姓名 CDATA #IMPLIED
年龄 CDATA #IMPLIED
联系信息 CDATA #REQUIRED
网站职务 CDATA #FIXED “页面作者”
个人爱好 CDATA "上网">
属性类型
 属性类型可以是以下十种中的任意一种:
 CDATA
ENTITY
 Enumerated
ENTITIES
 ID
NMTOKEN
 IDREF
NMTOKENS
 IDREFS
NOTATION
属性类型—CDATA
纯文本,即由字符、符号“&”、小于号“<”和
引号“””组成的字符串。
例子:
<?xml version = “1.0”
encoding=“GB2312”
standalone = “yes”?>
<!DOCTYPE 剧本 [
<!ELEMENT 剧本 ANY>
<!ELEMENT 对话 (#PCDATA)>
<!ATTLIST 对话 演员 CDATA>
]> <剧本>
<对话 演员=“路人甲”>我可不这么认为!</对话>
<对话 演员=“路人乙">为什么呢?</对话>
</剧本>
属性类型—枚举类型

属性也可以被描述为一组可接受的取值的列表,关键字
ENUMERATED是不出现在DTD定义中的。
<?xml version = “1.0”
encoding=“GB2312”
standalone = “yes”?>
<!DOCTYPE 购物篮 [
<!ELEMENT 购物篮 ANY>
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 类型( 鸡肉|牛肉|猪肉|鱼肉 ) “鸡肉”>
]>
<购物篮>
<肉 类型 = “鱼肉”/>
<肉 类型 = “牛肉”/>
属性“类型”定义的缺省
<肉/>
值是“鸡肉”,所以“购
</购物篮>
物篮”中的第三个元素的
“类型”属性取值为“鸡
属性类型— ID
ID 类型
元素的某些属性值是不能重复的
ID的值必须是一个有效的XML名称
注意
 不要给ID类型的属性事先指定缺省值,这很容易引起
不同的元素具有相同的标识的情况;
 ID属性经常使用REQUIRED缺省类型,也可以使用
IMPLIED缺省类型,但不能使用FIXED缺省值。
实例
<?xml version = "1.0" encoding="GB2312"
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名,EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ATTLIST 联系人 编号 ID #REQUIRED>
]>
<联系人列表>
<联系人 编号="1">
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
<联系人 编号="2">
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
</联系人列表>
standalone = "yes"?>
属性类型— IDREF/IDREFS
允许一个元素的属性使用文件中的另一个
元素,方法就是把那个元素的ID标识值作
为该属性的取值。
IDREF/ IDREFS适用于多对一、一对多。
实例
<?xml version = "1.0" encoding="GB2312"
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名,EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ATTLIST 联系人 编号 ID #REQUIRED>
<!ATTLIST 联系人 上司 IDREF #IMPLIED>
]>
<联系人列表>
<联系人 编号=“2”>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
<联系人 编号=“1” 上司=“2”>
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
</联系人列表>
standalone = "yes"?>
属性类型—NMTOKEN/NMTOKENS
为XML数据处理操作指定一个操作方法(如一
个java类),例如:
DTD定义:
<!ELEMENT 数据(#PCDATA)>
<!ATTLIST 数据
安全性 ( ON | OFF ) "OFF">
<!ATTLIST 数据
授权用户 NMTOKENS #IMPLIED>
XML文件:
<数据 安全性="ON" 授权用户 = "IggieeB SelenaS GuntherB">
blah blah blah
</数据>
属性类型—NOTATION
 NOTATION类型
允许属性值为一个DTD中声明的符号,这个类型对于使用非
XML格式的数据非常有用,如图象、声音、影象等等。
对于这些数据,XML应用通过为它设定NOTATION类型属性,可
以向应用程序指定一个外部处理程序。
定义方法
 使用MIME类型:
<!NOTATION 记号名 SYSTEM “MIME类型”>
 使用一个URL路径(指定一个处理程序):
<!NOTATION 记号名 SYSTEM “URL路径名”>
实例
<?xml version = "1.0"
"yes"?>
encoding="GB2312" standalone =
<!DOCTYPE 文件[
<!ELEMENT 文件 ANY>
<!ELEMENT 电影 EMPTY>
<!ATTLIST 电影 演示设备 NOTATION ( mp | gif )
#REQUIRED>
<!NOTATION mp SYSTEM "movPlayer.exe">
<!NOTATION gif SYSTEM "Image/gif">
]>
<文件>
<电影 演示设备 = "mp"/>
</文件>
为“电影”元素指定了两种可选设备:
movPlayer.exe用来播映.mov文件
另一种则用来绘制GIF图象。
属性类型— Entities
实体属性
<!ATTLIST 元素名 属性名 ENTITY 默认值>
实体
–内部实体
<!ENTITY 实体名 "实体内容">
–外部实体
<!ENTITY 实体名 SYSTEM "外部文件名">
–实体引用
&实体名称;
实例
<?xml version = "1.0" encoding="GB2312"
"yes"?>
standalone =
<!DOCTYPE 文件[
<!ELEMENT 文件 ANY>
<!ELEMENT 电影 EMPTY>
<!ATTLIST 电影 来源 ENTITY #REQUIRED>
<!ENTITY BladeRunner SYSTEM "dvds/BR/br.mov">
]>
<文件>
<电影 来源 = "&BladeRunner;"/>
</文件>