第三节 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提供了实体
引用法:
特殊字符
实体引用
>
>
<
<
&
&
"
"
’
'
字符数据
举例
数据中的特殊字符
字符数据内容:“加入A>B,则B一定是偶数”
正确XML表示形式:
<示例>加入A>B,则B一定是偶数</示例>
属性值中的特殊字符
错误写法:
<STATEMENT VALUE = "She said, "Don’t go there!"">
正确写法:
<STATEMENT VALUE = "She said, "Don't go
there!"">
字符数据
特殊字符数据表示方法二:CDATA
格式
<![CDATA[
文本内容
]]>
CDATA文本内容中是不能出现字符串“]]>”,
因为它代表了CDATA数据块的结束标志。
CDATA下所有内容都被当作字符数据看待。
字符数据
CDATA与实体引用比较
CDATA表示方式
<示例><![CDATA[<姓名>张三</姓名>]]></示例>
实体引用表示方式
<示例><姓名>张三</姓名></示例>
注释
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;"/>
</文件>