Download presentation
Presentation is loading. Please wait.
1
扩展标记语言XML (Extensible Markup Language)
问题: 什么是XML? XML为什么如此重要? 如何使用XML来定义自己的数据结构? 如何建立一个使用XML的应用? 如何把XML转化为HTML?
2
扩展标记语言XML (Extensible Markup Language)
文档类型定义(Document Type Definition) XML模式(XML Schema) XML文档的解析 简单应用程序接口(Simple API for XML) 文档对象模型(Document Object Model) XML文档的显示 层叠样式单(Cascading Style Sheets) 扩展样式单语言(eXtensible Style sheet Language)
3
XML主要术语 文档类型定义(DTD):它规定了文档的逻辑结构,可以定义文档的语法以及使用XML解析器验证文档的合法性,它也可以定义文档的元素、元素的属性以及元素和属性的关系。其不足之处是:采用了非XML的语法规则、缺乏种类丰富的数据类型以及扩展性较差等。 XML模式(Schema):针对DTD的上述缺点,微软公司等推出了XML模式,其特点是保留并扩充了DTD原有的功能并弥补了它的不足。
4
XML主要术语 文档对象模型(DOM):一个结构化文档编程接口,它定义了文档的逻辑结构以及访问和操作文档的方法,XML文档中的元素就是DOM树中的节点对象,使用DOM模型,可以方便地创建文档,导航其结构或增加、删除、修改和移动文档中的任何成分。 简单应用程序接口(SAX):一种基于事件的模型,可用于避免构造复杂的文档结构,尤其是当文档规模特别庞大或只对其中某一点感兴趣时,SAX就会更显出其优越性。SAX事件由解析器在进入或离开文档、元素、子树、属性时产生。
5
XML主要术语 XML文档分类:XML文档可以分为两大类,即以数据为中心和以文档为中心。以数据为中心的文档具有非常规则的结果,比如关于销售订单XML文档等,它通常是为机器设计的,即主要是方便机器进行处理;而以文档为中心的文档主要是为人类而设计的,它的文档具有不规则的结构,而且数据的粒度也比较大,比如书本、电子邮件、广告等等。
6
XML简介 XML起源 XML特征 XML应用举例 XML下的Web体系结构 XML词汇表
7
XML起源 60年代末,IBM公司为了解决不同专用格式创建的法律文件无法在公司的各部门间相互移植的问题,提出了通用标记语言,后建立了标准通用标记语言(Standard Generalized Markup Language , SGML) 。1986年,国际标准化组织ISO采用了SGML。 HTML是SGML的一个子集,仅仅用来格式化数据,是一个不可扩充的标记集合,用户不能够增加有意义的可以让其他人使用的标记。
8
XML起源 1996年,万维网协会(W3C)开始设计一种可扩展的标记语言,使其能够将SGML的灵活性和强大功能与已经被广泛采用的HTML结合起来。后来称这种语言为XML,它继承了SGML的规范,是后者的一个子集。 1998年2月,XML1.0成为了W3C的推荐标准。 XML是一种界定文本数据的简便而标准的方法。它曾经被人称作"Web上的ASCII码"。就好像用户可以使用自己喜爱的编程语言来创建任何一种数据结构,然后同其他人在其他计算平台上使用的其他语言来共享一样。XML的标记用来说明用户所描述的概念,而属性则用来控制它们的结构。所以,用户可以定义自己所设计出的语法并同其他人共享。
9
XML特征 XML是一种使用标记标记内容以传输信息的简单方法。标记用于界定内容,允许自行定义任意复杂度的结构。这一切都是使用普通的文本。
10
XML特征 XML用来描述数据结构,而HTML只是用来描述数据的显示,并不能给出有关于数据的信息。XML并非HTML的替代品,XML中没有与可视化表现形式有关的内容,与注重数据及其表达方式的HTML不同,XML只关心数据本身。 文档的数据库化和数据的文档化是XML走向成功的主要推动力之一。在XML之前,即使对于不太复杂的数据,Web也没有标准的数据交换格式。XML文档在很多方面与传统的关系和对象数据库数据相似,掌握了XML,就能够像处理其他类型的数据一样来处理文档了。
11
XML特征 W3C为XML标准化了一套应用程序编程接口(Application Programming Interface, API),用户可以轻松地编制读写XML的程序。 XML的数据描述机制意味着它将成为一种在Internet上共享信息的强大途径,因为: 它是开放的:XML能够在不同的用户和程序之间交换数据,而不论其平台如何。 它的自描述的特性使其对于B2B和企业内部网解决方案来说是一种有效的选择。 无需事先协调,我们就可以在程序之间共享数据。
12
XML特征 数据发布和交换 XML是数据库信息交换方面的一个重要工具。典型情况下,数据库用来进行信息交换的文件格式是很简单的,比如每行一个记录,记录的域之间用分号隔开。但这种方法对于数据库产生的面向对象的新信息是不够的,因为对象可能有其内部结构,对象之间还可能有链接。XML可以用元素和属性来表示这种信息,它为在数据库之间传送记录提供了一种公共格式。 电子商务 XML将使电子商务更加易于标准化、具有更高的可扩展性、并能够与Internet的其他主要技术更好地结合起来。这种软件和标准的易用性使更多小组织可以使用电子商务。
13
XML特征 元数据(metadata) 元数据就是关于信息的信息,定义了一套创建标记语言的语法,开发者可以使用它们来定义自己的标记语言。元数据在Web上的下一个发展趋势是在XML之上形成一个标准化层,称为资源描述框架结构(Resource Description Frame)。 Web上的科学研究 万维网协会制定了一种新的基于XML的语言,称为MathML,主要用于在Web上进行数学研究,描述数学公式等。
14
数据库和XML XML文档具有“可自描述”、“无限嵌套”、“树形结构”等特点,因此在某种意义上,一个XML文档就是一个数据库或其中的一张表。
<student> <id> </id> <name>Mike</name> <sex>male</sex> <birth> </birth> </student> … student: id name sex birth Mike male …
15
数据库和XML 数据库和XML有很多相同的地方,但是XML作为数据交换的标准,更着重于统一数据结构,而不是提供数据库的特性,不要设法让其中的任何一个做所有的事情。 XML数据本身的树形结构不同于关系模型中的二维表结构。数据库产品处理XML数据一般有两种方式: 扩展RDBMS,加入XML支持模块,完成XML数据和数据库之间的格式转换和传输,如把整个XML文档作为表中一行,或把XML文档进行解析后,存储到相应的表格中。同时支持W3C的一些XML操作标准,提供优化的XML处理模块。 采用层次数据存储模型,保持XML文档的树形结构,省掉了XML文档和传统数据库的数据转换过程,形成了Native XML数据库。
16
数据库和XML
17
数据库和XML select CustomerID,ContactName from dbo.customers where city='London'; CustomerID ContactName AROUT Thomas Hardy BSBEV Victoria Ashworth CONSH Elizabeth Brown EASTC Ann Devon NORTS Simon Crowther SEVES Hari Kumar
18
数据库和XML select CustomerID,ContactName from dbo.customers where city='London' for xml auto; <dbo.customers CustomerID="AROUT" ContactName="Thomas Hardy"/><dbo.customers CustomerID="BSBEV" ContactName="Victoria Ashworth"/><dbo.customers CustomerID="CONSH" ContactName="Elizabeth Brown"/><dbo.customers CustomerID="EASTC" ContactName="Ann Devon"/><db
19
XML下的Web体系结构 关系型 数据 客户 有脚本的 XML或 端浏 HTTP HTML 览器 服务器 文档 应用程序 服务器 程序或
代理 XML 文档 HTTP 服务器 层次型 数据
20
词汇表 XML一向致力于简便而快速地根据企业、科学规范或者其他方面的需要来构造定制的标记集。同时,每一个企业(甚至每一个人)都可以选择定义自己的XML标记集,XML的一个好处就在于能够共享这类"词汇表",它们都使用同样的基本语法、分析程序以及其他工具。可共享的XML词汇表不仅提供了更易于查询的文档和数据库,而且为在不同的组织和计算机应用程序之间交换信息提供了一条途径。 科学词汇表 商业词汇表 法律词汇表 医学词汇表 计算机词汇表
21
词汇表 所有XML命名都必需以字母、下划线(_)或冒号开头,后面跟着的是有效命名字符。有效命名字符除了前面的内容,还包括数字、连字符(-)、句点(.)。在实际应用当中不应该使用冒号,除非是用作命名空间的分隔符。记住字母并非局限于ASCII码是非常重要的,因为人们可以把自己的语言用在标记当中。
22
XML语法 标记语法 文档结构 元素 属性 实体
23
标记语法 XML标记负责提供和描述一个XML文件或XML实体的内容结构。它们由界定内容的不同部分的标记(tag)组成,负责提供到特殊符号和文本宏的引用,或者将特殊指令传递给应用软件,以及把注释传递给文档编辑器。 XML元素组成结构如下图: <B1 ALIGN="CENTER" > A Heading </B1> 属性 标记 内容 标记 元素
24
标记语法 XML元素的结构与HTML基本相同,XML也同样使用<>来界定标记,但二者的相同点也就仅此而已。
与HTML不同,所有的XML标记都是大小写敏感的,其中包括元素的标记名和属性值。大小写敏感,主要是满足XML国际化的设计目标和简化处理过程的需要。 XML指定的字符均在16位的Unicode2.1字符集中定义。合法的XML字符包括三个ASCII控制符,所有普通的ASCII可显示字符,以及所有其他统一代码字符值(用十六进制表示)。 统一代码中包含一个数量超过137000的字符集合用于应用程序特定字符,它被称为"保留区域"。使用这些私有字符进行任何XML数据的交换都需要就这些字符的解释单独达成一致,所以统一代码的这个部分不应该在XML数据对象中使用。
25
标记语法 字符值(十六进制) 描 述 09 水平制表符(HT) 0A 换行(LF) 0D 回车(CR) 20••7E ASCII显示字符
描 述 09 水平制表符(HT) 0A 换行(LF) 0D 回车(CR) 20••7E ASCII显示字符 80••D7FF 统一代码字符 E000••F8FF "私有区域" F900••FFFD CJK(中日韩)兼容的象形文字 10000••10FFFF 待用集和"高度私有区域"
26
文档结构 元素 标记 属性 控制信息 注释 处理指令 文档类型声明 实体
27
元素 元素被标记包围 有一个根元素 标记嵌套 大小写敏感 标记成对使用 空标记 错误的嵌套: <serves>
<instructions> </serves> </instructions> 大小写敏感 标记成对使用 空标记 <ingredient/> (<ingredient> </ingredient>)
28
属性 属性用来描述元素的性质,其特点如下: 属性值使用单引号或双引号加以标注,两者等价 一个元素可以有多个属性,排列不区分次序
使用子元素也可以达到相同的效果,只不过子元素是有次序的 <img src="./photos/myfriend.jpg" height="120" width="34" alt="Mr. Wang"/> <img> <src> ./photos/myfriend.jpg </src> <height>120</height> <width>34</width> <alt>Mr. Wang</alt> </img>
29
控制信息 注释 处理指令 <!-- comments text here -->
XML处理指令有助于XML文档的使用者和自动处理软件确定该文档为XML文档,同时也规定了XML的版本和字符编码,有助于优化XML文档的解析。 处理指令<?xml …?>一般可以包含3个属性: version:XML的版本,必需属性 encoding:XML文档采用的字符集,可选属性 standalone:XML文档是否使用外部DTD子集,可选属性 <?xml version="1.0"?> <?xml version="1.0" encoding="GB2312"?> <?xml version="1.0" standalone="yes"?>
30
控制信息 文档类型声明 声明DTD文件,用来保存XML文档的语法规则 DTD保存在XML文档外部 DTD保存在XML文档内部
<!DOCTYPE cookbook SYSTEM "./recipe.dtd"> XML文档类型 : cookbook 属于:SYSTEM (自定义),PUBLIC (W3C) 文件:recipe.dtd(URL) DTD保存在XML文档内部
31
实体 实体可以视为一个容器,它是XML文档的一部分,而不仅仅是一个简单的元素。它类似于C/C++语言中的define宏定义指令。
通常使用的实体一般分为如下几类: 预定义实体:< > & ' " 通用实体: 内部实体:实体内容定义在使用该实体的XML文档中 外部实体:实体内容定义在使用该实体的XML文档外
32
文档类型定义 元素声明的基本格式为: <!ELEMENT 元素名 元素内容模式> 元素内部模式: 星号:item*
括号:(item1, item2) 逗号:(item1, item2, item3) 管道:(item1 | item2) 加号:item+ 问号:item?
33
文档类型定义 元素定义举例: <!ELEMENT cookbook (category+)>
<!ELEMENT recipe (name, ingredient+, cooking+, serves?, instruction*)> <!ELEMENT name (#PCDATA)>
34
文档类型定义 属性的声明包含: 属性声明的基本格式为: 元素的名字 属性的名字 属性的数据类型 属性的值
<!ATTLIST 元素名 属性名1 类型 缺省值 属性名2 类型 缺省值 … >
35
文档类型定义 常用的属性数据类型: 属性的值: 属性声明举例: PCDATA : 可解析字符串 CDATA : 字符串
#REQUIRED : 属性必须有具体的取值 #IMPLIED : 属性可有具体的值,也可以为空 #FIXED "value" : 属性的取值是常量 "value" : 缺省值 属性声明举例: <!ATTLIST qty amount CDATA #REQUIRED unit CDATA "g">
36
文档类型定义 实体的声明与引用 预定义实体 内部实体:包含在XML文档中 外部实体:包含XML文档外
< > & ' " 内部实体:包含在XML文档中 语法格式为:<!ENTITY 实体名 "实体内容"> <!ENTITY POS "pinch of salt"> <item>Finally add the &POS;</item> 外部实体:包含XML文档外 <!ENTITY myimage SYSTEM "photo.png" NDATA PNG> <IMG PIC="myimage"/>
37
一个完整的XML文档 食谱的定义: XML文档 DTD 浏览器中显示 XMLSPY:正规与有效
38
命名空间 一个例子: 两个名字相同的元素代表不同的对象,如何处理?
<staff> <name> Chris Bates </name> <dept> <name> School of CMS </name> </dept> </staff> 两个名字相同的元素代表不同的对象,如何处理? XML命名空间:名称的集合,是把多个词汇混合为一个单一文档的标准工具。一般情况下,为了方便使用者集成词汇,所有的XML应用都应该为元素定义一个命名空间。
39
命名空间 命名空间与元素的关系,就如同元素和属性的关系一样。通常情况,如果需要把一个命名空间应用到整个文档,可以在根元素中对命名空间进行声明。 声明形式:xmlns : Prefix = "URI" URI是统一资源标识符。命名空间的URI可以使用http URL和URN(统一资源命名)。URN规范RFC2141中指出,URN是永久且不依赖位置的资源标识符。所有命名空间的URI必须是绝对值,而不应该是相对值。 URL: URL: /chess (error) URN:uuid:BDC6E3F0-6DA3-11D1-A2A3-00AA00C14882 URN:schemas-microsoft-com:xml-data URN:ISBN:
40
命名空间 根据是否含有Prefix,命名空间声明分为缺省命名空间和显式命名空间。
<movies xmlns=" <mov:movies xmlns:mov=" 根据是否含有有Prefix,元素名字分为非受限名(unqualified name)和受限名(qualified name)。 <mov : title>Raising Arizona</mov : title> <title>Raising Arizona</title>
41
命名空间 缺省命名空间 <movies xmlns=" <movie type="comedy" rating="R" review="5" year="1988"> <title>Midnight Run</title> <comments>The quintessential road comedy.</comments> </movie> </movies>
42
命名空间 <movies xmlns="http://www.michaelmorrison.com/ns/movies">
<movie type="comedy" rating="R" review="5" year="1988"> <title xmlns=" Midnight Run </title> <comments>The quintessential road comedy. </comments> </movie> </movies>
43
命名空间 显式命名空间 <mov:movies xmlns:mov=" <mov:movie type="comedy" rating="R" review="5" year="1988"> <mov:title>Midnight Run</mov:title> <mov:comments>The quintessential road comedy.</mov:comments> </mov:movie> </mov:movies>
44
命名空间 多个命名空间的混合使用: 显式命名空间 缺省和显式命名空间
45
命名空间 在XML文档中,标记中的属性也可以使用命名空间。 对属性使用命名空间应该避免出现下面两种情况: 错误的例子: 属性具有相同的名字;
属性是受限名,本地名相同,而且前缀指向的命名空间是相同的。 错误的例子: <?xml version="1.0"?> <x xmlns:n1=" xmlns:n2=" <bad a="1" a="2"/> <bad n1:a="1" n2:a="2"/> </x>
46
命名空间 对属性正确使用命名空间的例子: <?xml version="1.0"?>
<x xmlns:n1=" xmlns:n2=" <good n1:a="1" n2:b="2"/> </x> <x xmlns=" xmlns:n2=" <good a="1" n2:a="2"/>
47
命名空间与DTD 利用DTD可以验证XML文档的有效性,一个XML文档可以没有DTD,但可以是格式正规的。同样一个使用了命名空间的XML文档也可以没有DTD。 命名空间引入了一个新的命名系统,但是没有涉及有效性验证,也没有涉及其在DTD中的声明。命名空间声明对DTD无作用。 受限名(bread:name)在XML文档中分为两部分,前缀+本地名,前缀(bread)被映射到一个URI。 在DTD中的受限名bread:name没有特殊的含义,不能被转化为两部分,而是一个整体。
48
命名空间与DTD 创建使用命名空间的XML文档应遵循的规则: 一个没有使用命名空间的XML文档 在DTD中声明所有的xmlns属性
每个命名空间使用一个前缀 不同的命名空间不要使用相同的前缀 最多使用一个缺省命名空间 一个没有使用命名空间的XML文档 <?xml version="1.0"?> <!DOCTYPE A [<!ELEMENT A (#PCDATA)>]> <A>a simple xml document</A>
49
命名空间与DTD-单个命名空间 如何使用单个命名空间? 错误的例子: 说明: <?xml version="1.0" ?>
<!DOCTYPE foo:A[ <!ELEMENT foo:A (#PCDATA)>]> <foo:A>a simple xml document</foo:A> <A>a simple xml document</A> 说明: 有效,但是没有命名空间的声明,因此格式不正规 格式正规,但是在DTD中没有对A的定义,因此无效
50
命名空间与DTD-单个命名空间 1.使用了显示命名空间声明的XML文档 <?xml version="1.0"?>
<!DOCTYPE foo:A[ <!ELEMENT foo:A (#PCDATA)> <!ATTLIST foo:A xmlns:foo CDATA #FIXED " <foo:A xmlns:foo=" a simple xml document</foo:A>
51
命名空间与DTD-单个命名空间 2.使用了缺省命名空间的XML文档 <?xml version="1.0"?>
<!DOCTYPE A[ <!ELEMENT A (#PCDATA)> <!ATTLIST A xmlns CDATA #FIXED " <A xmlns = " a simple xml document</A>
52
命名空间与DTD-多个命名空间 存在一个没有使用命名空间的XML文档,如何把这个XML文档嵌入到自己的XML文档中?
<?xml version="1.0" ?> <!DOCTYPE A [ <!ELEMENT A (#PCDATA)> ]> <A>another simple xml document</A> 存在一个没有使用命名空间的XML文档,如何把这个XML文档嵌入到自己的XML文档中? 使用多个命名空间来避免名称冲突。
53
命名空间与DTD-多个命名空间 <?xml version="1.0"?> <!DOCTYPE foo:A[
<!ELEMENT foo:A (bar:A)> <!ATTLIST foo:A xmlns:foo CDATA #FIXED " <!ELEMENT bar:A (#PCDATA)> <!ATTLIST bar:A xmlns:bar CDATA #FIXED " <foo:A xmlns:foo = " <bar:A xmlns:bar = " a complex xml document </bar:A> </foo:A>
54
XML Schema DTD的不足: 提供的数据类型有限。如不提供整型,浮点型、布尔型等数据类型
基于正则表达式,描述能力有限。如不能定义一个元素的子元素的具体出现次数。 约束能力不强,结构化不够 构建和访问没有标准的编程接口 对命名空间的支持不足
55
XML Schema XML Schema与DTD相比的优点:
本身是一个XML文档。可以使用XML编辑器编辑,利用XML解析器解析,也可以用标准的编程接口如DOM和SAX对其进行处理。 数据类型丰富。如String , Boolean , Number , Date and time。还可以定义型的数据类型。 与命名空间紧密联系。 XML Schema Definition Language(XSD)是基于XML的一种语言,用来 定义用户标记语言,验证XML文档的有效性,比DTD更为有效,能够更好的控制标记语言的设计。
56
XML Schema XSD Schema文档的基本格式: 注: 为了引用XSD元素和属性,必须在根元素中声明XSD命名空间
<?xml version="1.0"?> <xsd:schema xmlns:xsd=" <!-- here is the content of the xsd schema --> </xsd:schema> 注: 为了引用XSD元素和属性,必须在根元素中声明XSD命名空间 XSD Schema文档中的所有元素和属性必须有前缀xsd: 一个老例子:XML文档 XSD Schema文档
57
XML Schema XSD 一系列元素和属性定义了XSD语言,在XSD Schema文档中可以使用这些元素和属性。XSD的核心是数据类型,决定了标记所代表的数据的类型。 XSD包含了两种基本的数据类型: 简单数据类型:数字,字符串,日期,时间和列表等 复杂数据类型:复合元素,元素的序列,建立在数据类型之上
58
XML Schema 简单类型元素使用xsd:element来创建,属性使用xsd:attribute来创建。
<xsd:element name="occupation" type="xsd:string"/> <xsd:attribute name="birthdate" type="xsd:date"/> 简单数据类型不能反映元素和属性之间的关系。复杂数据类型可以解决此问题,它用来描述元素的内容模型。 <person birthdate=" " weight="160"> <name>Milton James</name> <title>Mr.</title> <occupation>mayor, chef</occupation> </person>
59
XML Schema <?xml version="1.0"?>
<xsd:schema xmlns:xsd=" <xsd:element name="person"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="title" type="xsd:string"/> <xsd:element name="occupation" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="birthdate" type="xsd:date"/> <xsd:attribute name="weight" type="xsd:integer"/> </xsd:complexType> </xsd:element> </xsd:schema>
60
XML Schema XSD Schema和XML文档
XSD Schema和XML文档的联系与DTD不同,不是通过文档类型声明来实现的,而是通过使用属性来进行。 使用XSD Schema来验证XML文档,需要在XML文档中设置属性noNamespaceSchemaLocation指向schema文档。 <?xml version="1.0"?> <person xmlns:xsi=" xsi:noNamespaceSchemaLocation="person.xsd" birthdate=" " weight="160"> <name>Milton James</name> <title>Mr.</title> <occupation>mayor, chef</occupation> </person>
62
XML Schema 简单数据类型 简单数据类型可以用来创建元素和属性,格式如下: 主要简单数据类型如下:
<xsd:element name="元素名" type="类型"/> <!--类型除了简单数据类型外,也可以是复杂数据类型--> <xsd:attribute name="属性名" type="类型"/> <!--类型只能是简单数据类型--> 主要简单数据类型如下: 字符串类型:xsd:string 布尔类型:xsd:boolean 数字类型:xsd:integer , xsd:decimal , xsd:float , xsd:double 日期和时间型:xsd:duration , xsd:dateTime , xsd:time , xsd:date , xsd:gYearMonth , xsd:gYear , xsd:gMonthDay , xsd:gDay , xsd:gMonth 自定义类型:xsd:simpleType
63
XML Schema 1.字符串类型 <xsd:element name="name" type="xsd:string"/>
<name>Milton James</name> 2.布尔类型 <xsd:attribute name="retired" type="xsd:boolean"/> <person retired="false"> </person> 注:布尔类型可以设置为true/false,或者1/0。
64
XML Schema 3.数字类型 xsd:integer : 无小数的整数,如:3
xsd:decimal : 有小数的十进制数,如:3.14 xsd:float : 单精度(32位)浮点数,如:6.022E23 xsd:double : 双精度(64位)浮点数 xsd:positiveInteger : 正整数 xsd:nonPositiveInteger : 非正整数 xsd:negativeInteger : 负整数 xsd:nonNegativeInterger : 非负整数 <xsd:attribute name="height" type="xsd:decimal"/> <xsd:attribute name="weight" type="xsd:integer"/> <person height="5.75" weight="160"> <name>Milton James</name> </person>
65
XML Schema 4.日期和时间型 xsd:duration : 一段时间,格式 : P[年Y][月M][日D][T[时H][分M][秒S]],如PT1Y2M3D xsd:dateTime : 某天时刻,格式 : 年-月-日T时:分:秒,如 T12:00:00 xsd:time : 某时刻,格式 : 时:分:秒,如:16:04:00 xsd:date : 某天,格式 : 年-月-日,如: xsd:gYearMonth : 某年某月,格式 : 年-月,如: xsd:gYear : 某年,格式 : 年,如:2005 xsd:gMonthDay : 某月某日,格式 : 月-日,如:09-22 xsd:gDay : 某日,格式 : 日,如:22 xsd:gMonth : 某月,格式 : 月,如:09
66
XML Schema Examples: xsd:duration
<marathon worldrecord="P6DT4H30M56S"/> xsd:dateTime <airship launch=" T09:00:00"/> xsd:gMonthDay <China NationalDay="10-1"/> <!--error--> <China NationalDay="10-01"/> 注:除xsd:duration外,其他类型中年为4为,月、日、时、分、秒均为2位。
67
XML Schema 5.自定义类型 不包含任何子元素,但包含数字、字符串、日期等简单数据内容的元素。用户可以自定义类型,通过改造简单数据类型来满足自己的需要,如限制一个数字类型的取值范围。 自定义类型的通常格式: <xsd:simpleType name="name"> <xsd:restriction base="simpletype"> <!-- usually here is the restriction elements--> </xsd:restriction> </xsd:simpleType>
68
XML Schema 常用的限制元素: 自定义类型分类: xsd:minInclusive : 允许的最小值
xsd:maxInclusive : 允许的最大值 xsd:totalDigits : 十进制数的最大位数 xsd:fractionDigits :十进制数小数部分的最大位数 xsd:minlength : 数据的最小长度 xsd:maxlength : 数据的最大长度 自定义类型分类: 基本自定义类型 高级自定义类型:枚举类型,列表类型,模式类型(pattern type)
69
XML Schema 基本自定义类型 <xsd:simpleType name="onetotenType">
<xsd:restriction base="xsd:integer"> <xsd:minInclusive value="1"/> <xsd:maxInclusive value="10"/> </xsd:restriction> </xsd:simpleType>
70
XML Schema 自定义类型的两种使用方法:
<xsd:element name="rating" type="onetotenType"> <!-- the following is the definition of onetotenType--> <xsd:element name="rating"> <!-- here is the definition of onetotenType without name--> </xsd:element>
71
XML Schema 例:密码元素的自定义 <xsd:element name="password">
<xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:minLength value="8"/> <xsd:maxLength value="12"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <password>,c.x/zmv</password>
72
XML Schema 例:资金元素的自定义 <xsd:element name="balance">
<xsd:simpleType> <xsd:restriction base="xsd:decimal"> <xsd:totalDigits value="6"/> <xsd:fractionDigits value="2"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <balance> </balance>
73
XML Schema 元素的属性如何限定? 通过<xsd:attribute>元素的use和value属性对定义的属性进行约束。
use的取值:optional(缺省值) , required , default , fixed , prohibited <xsd:attribute name="balance" type="xsd:decimal" use="default" value="0.0"/> <xsd:attribute name="expired" type="xsd:boolean" use="fixed" value="false"/>
74
XML Schema 高级自定义类型 1.枚举类型
枚举类型用来限制一个简单类型的可能取值,简单类型可以是除了布尔类型的其他类型。枚举类型使用xsd:enumeration在xsd:restriction中进行定义。 枚举类型的基本格式: <xsd:simpleType name="name"> <xsd:restriction base="simpletype"> <xsd:enumeration value="enumerated value"/> <!-- the other enumerated values--> </xsd:restriction> </xsd:simpleType>
75
XML Schema 例:枚举类型 <xsd:element name="team">
<xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:enumeration value="Detroit Red Wings"/> <xsd:enumeration value="Chicago Blackhawks"/> <xsd:enumeration value="Columbus Blue Jackets"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <team>Detroit Red Wings</team>
76
XML Schema 2.列表类型 枚举类型只允许使用一个枚举的数值,而列表类型允许针对一个元素提供多个数值。列表类型使用xsd:list元素来定义。 列表类型的基本格式: <xsd:simpleType name="name"> <xsd:list itemType="simpletype"/> </xsd:simpleType>
77
XML Schema 例:列表类型 <xsd:element name="rainfall">
<xsd:simpleType> <xsd:list itemType="xsd:decimal"/> </xsd:simpleType> </xsd:element> <rainfall> </rainfall> 如何限定列表中数据的个数?
78
XML Schema <xsd:element name="rainfall"> <xsd:simpleType>
<xsd:restriction base="mylist"> <xsd:length value="7"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:simpleType name="mylist"> <xsd:list itemType="xsd:decimal"/> <rainfall> </rainfall>
79
XML Schema 3.模式类型 模式类型允许用户使用一个正规表达式来指定一个模式,这个模式用来控制简单类型的格式。模式类型使用xsd:pattern元素来定义。 模式类型的基本格式: <xsd:simpleType name="name"> <xsd:restriction base="xsd:string"> <xsd:pattern value="regular expression"/> </xsd:restriction> </xsd:simpleType>
80
XML Schema XSD中使用的正规表达式的主要标记: .-任意单个字符 \d-任意单个数字 x?-0个或1个x x+-1个或多个x
(xy)-x和y是整体 x|y-x或y [xyz]-x , y , z中任意一个 [x-y]-在x到y的范围内 x{n}-n个x x{n , m}-n到m个x
81
XML Schema 例:模式类型 <xsd:element name="phonenum">
<xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d\d\d-8820\d\d\d\d"/> <!--<xsd:pattern value="\d{3}-8820\d{4}"/>--> </xsd:restriction> </xsd:simpleType> </xsd:element> <phonenum> </phonenum>
82
XML Schema 例:模式类型 <xsd:element name="pizza">
<xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:pattern value="(small|medium|large)-(thin|deep)-(sausage\+)?(pepperoni\+)?(mushroom\+)?(peppers\+)?(onions\+)?(anchovies\+)?"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <pizza>medium-deep-sausage+mushroom+</pizza>
83
XML Schema 复杂数据类型 复杂数据类型是建立在简单数据类型之上的,用来定义元素的内容模型。复杂数据使用xsd:compleType创建。与简单类型相似,可以建立一个带名字属性的复杂类型,也可以把复杂类型建立在一个元素内,从而省略名字。 复杂数据类型的元素可以含有属性,进一步依据是否含有文本内容和子元素,复杂数据类型分为三类: 空元素(Empty elements):可含文本内容,不含子元素 仅含子元素的元素(Element-only elements):不含文本内容,含子元素 混合元素(Mixed elements):含文本内容和子元素
84
XML Schema 空元素(Empty elements)
空元素可以含有属性和文本内容,但是不包含子元素。空元素只能使用属性来描述元素的信息。空元素使用xsd:complexType和xsd:simpleContent来创建。 创建空元素的格式: <xsd:element name="name"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="type"> <!– 属性的定义 --> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> 注:使用xsd:simpleContent和xsd:extension可以加入文本内容
85
XML Schema 例1:不带文本内容的空元素 <?xml version="1.0"?>
<xsd:schema xmlns:xsd=" <xsd:element name="automobile"> <xsd:complexType> <xsd:attribute name="vin" type="xsd:string"/> <xsd:attribute name="year" type="xsd:string"/> <xsd:attribute name="make" type="xsd:string"/> <xsd:attribute name="model" type="xsd:string"/> </xsd:complexType> </xsd:element> </xsd:schema> <automobile xmlns:xsi=" xsi:noNamespaceSchemaLocation="automobile.xsd" vin="SALHV1245SA661555" year="1995" make="Land Rover" model="Range Rover"></automobile>
86
XML Schema 例2:带文本内容的空元素 <xsd:element name="automobile">
<xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:positiveInteger"> <xsd:attribute name="vin" type="xsd:string"/> <xsd:attribute name="year" type="xsd:string"/> <xsd:attribute name="make" type="xsd:string"/> <xsd:attribute name="model" type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> <automobile vin="SALHV1245SA661555" year="1995" make="Land Rover" model="Range Rover">2</automobile> 说明automobile的文本内容为positiveInteger
87
XML Schema 仅含子元素的元素(Element-only elements)
Element-only元素可以含有属性和子元素,但不含有文本内容。Element-only元素使用xsd:complexType来创建。 使用xsd:sequence , xsd:choice , xsd:all定义一个子元素列表,对子元素的顺序和出现进行限定。 xsd:choice : 子元素列表中只能有一个子元素被使用 xsd:sequence : 子元素列表中的子元素按照定义的顺序出现 xsd:all : 子元素列表中的子元素的可以无序出现,它必须出现在元素内容模型定义的顶部,而且内容必须是独立的元素 Element-only元素的创建格式: <xsd:element name="name"> <xsd:complexType> <!-- 子元素列表--> </xsd:complexType> </xsd:element>
88
XML Schema 例:xsd:sequence的使用 <xsd:element name="quiz">
<xsd:complexType> <xsd:sequence minOccurs="1" maxOccurs="20"> <xsd:element name="question" type="xsd:string"/> <xsd:element name="answer" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <quiz> <question>What does XML stand for?</question> <answer>eXtensible Markup Language</answer> <question>Who is responsible for overseeing XML?</question> <answer>World Wide Web Consortium(W3C)</answer> </quiz> maxOccurs为unbounded代表次数没有限制 maxOccurs可用在单个元素中,用来控制出现次数
89
XML Schema 例:xsd:choice的使用 <xsd:element name="id">
<xsd:complexType> <xsd:choice> <xsd:element name="ssnum" type="xsd:string"/> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="birthdate" type="xsd:date"/> </xsd:sequence> <xsd:element name="licensenum" type="xsd:string"/> </xsd:choice> </xsd:complexType> </xsd:element>
90
XML Schema 例:xsd:choice的使用 <id>
<ssnum> </ssnum> </id> <name>Milton James</name> <birthdate> </birthdate> <licensenum> </licensenum>
91
XML Schema 例:xsd:all的使用 <xsd:complexType name="automobileType">
<xsd:simpleContent> <xsd:extension base="xsd:anyType"> <xsd:attribute name="vin" type="xsd:string"/> <xsd:attribute name="year" type="xsd:string"/> <xsd:attribute name="make" type="xsd:string"/> <xsd:attribute name="model" type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:complexType name="houseType"> <xsd:attribute name="year" type="xsd:gYear"/> <xsd:attribute name="area" type="xsd:positiveInteger"/>
92
XML Schema 例:xsd:all的使用 <xsd:element name="assets">
<xsd:complexType> <xsd:all> <xsd:element name="automobile" type="automobileType"/> <xsd:element name="house" type="houseType"/> </xsd:all> </xsd:complexType> </xsd:element> <assets xmlns:xsi=" xsi:noNamespaceSchemaLocation="assets.xsd"> <house year="1995" area="400"/> <automobile vin="SALHV1245SA661555" year="1995" make="Land Rover" model="Range Rover">2</automobile> </assets>
93
XML Schema 错误Schema: xsd:all不在顶部 xsd:all包含了不独立的元素
<xsd:complexType name="PurchaseOrderType"> <xsd:sequence> <xsd:all> <xsd:element name="shipTo" type="USAddress"/> <xsd:element name="billTo" type="USAddress"/> <xsd:element name="items" type="Items"/> <xsd:element name="comment" type="Comment"/> </xsd:sequence> </xsd:all> <xsd:attribute name="orderDate" type="xsd:date"/> </xsd:complexType> xsd:all不在顶部 xsd:all包含了不独立的元素
94
XML Schema 混合元素(Mixed elements)
混合元素可以包含属性,文本内容和子元素,是最灵活的元素。混合元素的创建类似于其他复杂类型,不过需要使用xsd:mixed属性。 混合元素的创建格式: <xsd:element name="name"> <xsd:complexType mixed="true"> <!-- 子元素,属性的定义--> </xsd:complexType> </xsd:element>
95
XML Schema 例:混合元素 <xsd:element name="message">
<xsd:complexType mixed="true"> <xsd:sequence> <xsd:element name="emph" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="to" type="xsd:string" use="required"/> <xsd:attribute name="from" type="xsd:string" use="required"/> <xsd:attribute name="timestamp" type="xsd:dateTime" use="required"/> </xsd:complexType> </xsd:element> <message to="you" from="me" timestamp=" T12:45:00"> I hope you return soon. I’ve <emph>really</emph> missed you! </message>
96
XML Schema 引用新元素的三种方法: 使用类型: 直接定义(不能重复使用) 定义新的数据类型,使用类型type来插入新元素
使用元素: 定义新的全局元素(直接定义在xsd:schema下的子元素),使用引用ref插入新元素 <login> <userid>xbwang</userid> <password>,c.x/zmv</password> <!-- 如何定义password? --> </login>
97
XML Schema 1.直接定义 <xsd:element name="login">
<xsd:complexType> <xsd:sequence> <xsd:element name="userid" type="xsd:string"/> <xsd:element name="password"> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:minLength value="8"/> <xsd:maxLength value="12"/> </xsd:restriction> </xsd:simpleType> </xsd:element> </xsd:sequence> </xsd:complexType>
98
XML Schema 2.定义新的数据类型 <xsd:simpleType name="eighttotwelve">
<xsd:restriction base="xsd:string"> <xsd:minLength value="8"/> <xsd:maxLength value="12"/> </xsd:restriction> </xsd:simpleType> <xsd:element name="login"> <xsd:complexType> <xsd:sequence> <xsd:element name="userid" type="xsd:string"/> <xsd:element name="password" type="eighttotwelve"/> </xsd:sequence> </xsd:complexType> </xsd:element>
99
XML Schema 3.定义新的全局元素 <xsd:element name="password">
<xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:minLength value="8"/> <xsd:maxLength value="12"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="login"> <xsd:complexType> <xsd:sequence> <xsd:element name="userid" type="xsd:string"/> <xsd:element ref="password"/> </xsd:sequence> </xsd:complexType>
100
XML Schema 一个完整的XML Schema的例子 XML文档 XSD Schema文档
101
XML模式语言总结 W3C XML Schema工作组制定了XML Schema,但是它并不是唯一的模式语言。
模式语言除了Schema、DTD外,还有RELAX NG,Schematron等。一般情况下根据需求,选择最适合自己的模式语言,有时还需要混合匹配多种模式语言,执行多层次的验证。 W3C XML Schema于Document Type Definitions是目前主流的模式语言。DTD是基于正则表达式的;而XSD Schema使用XSD标记语言建立,是一种基于XML的标记语言,统一了XSD Schema文档和XML文档的创建方法。 XML Schema是DTD的替代品?
102
XML模式语言总结 W3C XML Schema 主要特征: 使用复杂类型验证元素和属性结构的有效性 使用简单类型验证文本内容的有效性
可派生新类型 验证父-子关系的有效性 支持有序、无序结构 支持命名空间 Document Type Definitions 主要特征: 具有更广泛的解析器和库支持 广泛支持父-子关系 能够定义实体和符号 支持属性默认值
103
XML模式语言总结 W3C XML Schema 适用情况: 文档包含数据库记录或对象,而不包含叙述性内容 数据需要确定类型
需要定义自定义数据类型 需要在模式中使用元信息注释元素 Document Type Definitions 适用情况: 文档是叙述性的,并具有混合内容 绝大多数验证是关于元素和属性的结构,而不是元素和属性的内容 需要定义实体 编写模式不能花费过多精力
104
XML解析器模型 一个XML文档,可以是格式正规的、有效的。由于具有这样的特点,XML文档常被用来存储数据,如何处理XML文档?
标准解析器(standard(nonvalidating) parser) 有效性解析器(validating parser) 如Internet Explorer 5.5,包含了一个XML标准解析器,能够处理XML文档,并使用样式单来显示它。
105
XML解析器模型 书写XML解析器有两种标准的接口规范:
简单应用程序接口(SAX):一种基于事件的模型,可用于避免构造复杂的文档结构,尤其是当文档规模特别庞大或只对其中某一点感兴趣时,SAX就会更显出其优越性。SAX事件由解析器在进入或离开文档、元素、子树、属性时产生。 文档对象模型(DOM):一个结构化文档编程接口,它定义了文档的逻辑结构以及访问和操作文档的方法,XML文档中的元素就是DOM树中的节点对象,使用DOM模型,可以方便地创建文档,导航其结构或增加、删除、修改和移动文档中的任何成分。
106
XML解析器模型 使用php+sax解析xml文档 XML Parser XML Application Program
SAX Interfaces XML Document DOM Interfaces 使用php+sax解析xml文档
107
简单应用程序接口SAX SAX : The Simple API for XML
SAX是由xml-dev邮件列表中的成员开发的,为处理XML文档提供了一种简单而直接的方法。SAX解析器只是触发特定的事件。可以使用任何语言编写SAX解析器。 1998年5月,SAX 1.0 2000年5月,SAX 2.0
108
简单应用程序接口SAX SAX 1.0 一个使用SAX1.0解析器的XML应用程序必须支持的一些方法:
characters()-当返回元素内字符时触发 endDocument()-当文档结束时触发 endElement()-当遇到元素的结束标记时触发 ignorableWhitespace()-当在元素间遇到空白符时触发 processingInstruction()-当遇到处理指令时触发 startElement()-当遇到元素的开始标记时触发 注:SAX 1.0不支持命名空间
109
简单应用程序接口SAX SAX 2.0 一个使用SAX2.0解析器的XML应用程序必须支持SAX1.0,另外还一些方法如下:
startPrefixMapping()-当前缀映射开始时触发 endPrefixMapping()-当前缀映射结束时触发 skippedEntity()-当在一个实体被跳过时触发
110
简单应用程序接口SAX 编写使用SAX解析器的XML应用程序首先要获得一个SAX解析器(当然可以自己编写)。常见的SAX解析器有:
Xerces : 支持SAX , 也支持DOM Level 2,从 Libxml : 基于Perl模块,从 Python : 方便Python编程者的使用,在Python2.0以后版本中支持SAX
111
简单应用程序接口SAX 例: 一个使用Xerces解析器的Java程序
112
简单应用程序接口SAX <?xml-stylesheet href="mystyle.css" type="text/css">
<dealership> <automobile make="Buick" model="Century" color="blue"> <option>CD player</option> </automobile> </dealership> Start document. Received processing instruction: Target: xml-stylesheet Data: href="mystyle.css" type="text/css" Start element: dealership Start element: automobile Start element: option Received characters: CD player End of element: option End of element: automobile End of element: dealership End of document reached. startDocument processingInstruction startElement characters endElement endDocument
113
简单应用程序接口SAX 总结 SAX是一种基于事件的模型。SAX解析器只是产生特定的事件,不做其他的处理。
应用程序和SAX解析器通常组合在一起对XML文档进行处理。 应用程序通过捕获SAX解析器触发的事件,调用相应的事件处理函数来对XML文档进行访问。
114
文档对象模型DOM 什么是DOM? DOM接口种类 如何使用DOM来访问XML文档中的数据? 如何使用DOM修改一个XML文档?
115
文档对象模型DOM DOM : Document Object Model
DOM提供了一个标准对象集来描述HTML和XML文档,给出了这些对象组合的方法,并提供了访问和操纵它们的接口。 DOM提供了一种标准,让程序能够以数据结构的形式来访问一个结构化的文档。 DOM解析器是基于DOM的一个程序,它能够读取XML并将其转化为一个数据结构,并将其交给应用程序进行进一步的处理。
116
文档对象模型DOM DOM是W3C制定的一个标准。 http://www.w3.org/DOM/ DOM的不同级别:
DOM level1 : 支持基本的XML、HTML DOM level2 : 支持命名空间,CSS,事件,新的访问方法 DOM level3 : 支持用户事件,支持XPath
117
文档对象模型DOM <?xml-stylesheet href="mystyle.css" type="text/css"?>
<dealership> <automobile make="Buick" model="Century" color="blue"> <options> <option>Cruise control</option> <option>CD player</option> </options> </automobile> <automobile make="Ford" model="Thunderbird" color="red"> <option>convertible</option> <option>leather interior</option> <option>heated seats</option>
118
The DOM representation of an XML document
make(Attribute) model(Attribute) color(Attribute) option (Element) (Text) automobile (Element) options (Element) Document Dealership (Element) option (Element) (Text) make(Attribute) model(Attribute) color(Attribute) option (Element) (Text) automobile (Element) option (Element) (Text) options (Element) option (Element) (Text)
119
文档对象模型DOM DOM接口 DOM解析器为了遵循DOM,必须实现一些接口。每个接口对应于DOM树中的特定类型的结点。
在应用程序中常用的接口有: 结点接口(Node Interface) 文档接口(Document Interface) 元素接口(Element Interface) 属性接口(Attribute Interface) 结点列表接口(NodeList Interface)
120
文档对象模型DOM 结点接口(Node Interface)
使用结点接口可以实现: 获得结点的属性:名字,数值,指向树根结点的指针; 访问结点的父亲,兄弟,子女;
121
文档对象模型DOM 文档接口(Document Interface)
XML文档的根元素不是DOM树的根结点,它只是文档结点的子元素结点。 使用文档接口可以实现: 访问子元素; 创建DOM树中的新元素; 创建DOM树中的新属性;
122
文档对象模型DOM 元素接口(Element Interface) 元素结点代表XML、HTML文档中的一个元素,使用元素接口来访问。
使用元素接口可以实现: 获得元素的名字; 获得、增加、删除元素的属性; 访问子元素;
123
文档对象模型DOM 属性接口(Attribute Interface)
使用属性接口可以实现: 访问属性的名字,数值; 访问一个布尔型的标志,它用来反映属性是否显式出现在文档中;
124
文档对象模型DOM 结点列表接口(NodeList Interface)
如通过元素接口可以访问该元素的所有子元素,它们就构成了一个结点列表。 使用结点列表接口可以实现: 获得结点列表的大小; 通过索引来访问结点列表中的结点;
125
文档对象模型DOM 使用DOM来访问XML文档中的数据
Internet Explorer(version5及以上版本)含有一个内置的DOM解析器,可以自动的把XML文档数据转化为一个DOM树。 在IE中通过DOM访问XML文档的两个例子: 例1:显示DOM树中结点的名字 源码 execute 例2:处理DOM树中不同类型的结点
126
文档对象模型DOM 使用DOM修改一个XML文档 获得DOM树中的文档结点 获得XML文档的根元素
var doc=document.all("cars").XMLDocument; 获得XML文档的根元素 var root=doc.childNodes.firstChild; var root=doc.childNodes(0); var root=doc.childNodes.item(0);
127
文档对象模型DOM 元素的基本操作: 新建一个元素 更新一个元素 删除一个元素
var newElement=doc.createElement("automobile"); root.appendChild(newElement); 更新一个元素 var replacementElem=doc.createElement("customer"); var oldNode=root.replaceChild(replacementElem,root.childNodes.lastChild); 删除一个元素 var anotherOldNode=root.removeChild(root.childNodes.lastChild);
128
文档对象模型DOM 属性的基本操作: 给元素添加一个属性 修改元素的属性 删除元素的一个属性
var attr=doc.createAttribute("make"); attr.text="Suburu"; root.childNodes.lastChild.setAttriuteNode(attr); 修改元素的属性 root.childNodes.lastChild.setAttribute("make","BMW"); 删除元素的一个属性 root.childNodes.lastChild.removeAttribute("make");
129
文档对象模型DOM 总结 DOM提供了一种标准,让程序能够以数据结构的形式来访问一个结构化的文档。
DOM解析器把XML转化为DOM树,应用程序通过接口对DOM树中的结点进行访问,即是对XML文档进行访问。
130
SAX与DOM SAX DOM 制订者 xml-dev邮件列表成员 W3C 访问方式 顺序 随机 处理方式 局部,事件驱动 全局,DOM树
功能 访问 访问,更改 实现 简单,效率高 复杂,内存要求高
131
XML文档的显示 XML文档的显示需要使用样式单(style sheet)技术。样式单是对XML文档进行格式化的一种机制。样式单是由一系列的样式规则(style rule)组成的。 HTML文档主要关注的是显示,不便于信息的查找。使用样式单则可以把XML文档的内容和显示分离开来,这样可以便于搜索引擎查找信息。 有两种基于样式单、对XML文档进行格式化的方法: 层叠样式单:CSS , Cascading Style Sheets 扩展样式单语言:XSL , eXtensible Stylesheet Language
132
XML文档的显示 层叠样式单(CSS) 层叠样式单是一种样式单语言,最早是用来解决HTML文档的显示,也可用来显示XML文档。它简单易学,已经得到广泛的支持。层叠样式单中包含了样式规则,它们被应用到相应的元素,定义了显示的字体,颜色,位置等。 扩展样式单语言(XSL) 扩展样式单语言是一种基于XML的样式单语言,比CSS更加强大。XSL由XSLT(XSL Transformation)和XSL-FO(XSL Formatting Objects)组成,它们都是基于XML的语言。 XSLT : 将一个XML文档转化为另一个逻辑结构,如XML文档,HTML文档,XHTML文档等; XSL-FO : XSL格式化对象,可认为是CSS的一个超集,完成XML文档的显示,但是没有得到广泛支持。
133
XML文档的显示 CSS的缺点: XSLT克服了上述的缺点,能够对XML文档内容进行搜索和重新排列,但是却没有格式化的能力。
不能对文档数据进行选择 不能对文档数据进行计算等处理 不能生成动态文本,如页数 XSLT克服了上述的缺点,能够对XML文档内容进行搜索和重新排列,但是却没有格式化的能力。 另外由于浏览器对XSL-FO支持的不足,通常把CSS和XSLT结合起来使用:使用XSLT把XML文档转化为一个HTML文档,然后使用CSS来显示。
134
XML文档的显示 XML文档显示的两个例子: 没有显示的XML文档 使用CSS显示 使用XSLT显示 XML文档 CSS文档 显示结果
XML文档 XSLT文档 显示结果
135
层叠样式单(CSS) 层叠样式单(CSS) : Cascading Style Sheets
CSS能够对XML文档内容进行格式化,使其显示在浏览器中。CSS起先是显示HTML文档内容的一种方法,也可以用来处理XML文档。CSS的样式规则不能保存在XML文档中,通常保存在扩展名为css的文件中。 层叠(cascading)说明了样式规则应用到HTML/XML文档中元素的方法。在层叠样式单中,特定的样式规则可以覆盖基本的样式规则,亦即,定义了一个元素的样式规则,如果定义它的子元素的样式规则,那么子元素使用自身的样式规则,否则自动继承使用父元素的样式规则。
136
层叠样式单(CSS) 问题: 什么是样式规则? 样式规则如何对应到元素? 样式规则可以定义显示内容的哪些属性? 样式单如何应用到XML文档?
137
层叠样式单(CSS) 样式规则的基本格式: Selector { Property1 : Value1;
… } 说明:1. 样式属性和属性值之间使用 : 分割; 2. 每一对样式属性和属性值之间用 ; 分割; 3. 使用 , 来定义作用于多个元素的样式规则; message { display : block; margin-bottom : 5px; font-family : Courier; font-size : 14pt ssnum, phonenum, { display : none; }
138
层叠样式单(CSS) 层叠样式单中的样式规则如何应用到HTML/XML文档的元素? 使用选择器建立元素和样式规则之间的联系。
在层叠样式单中有三种类型的选择器: 基于元素类型的:通过元素类型(即元素名字)来选择元素 基于class属性的:通过元素的class属性来选择元素 基于ID属性的:通过元素的ID属性来选择元素
139
层叠样式单(CSS) 基于元素类型的选择器 通过元素类型来建立元素和样式规则之间的联系。 <message>
It’s very lonely here – I really miss you. </message> message { display : block; margin-bottom : 5px; font-family : Courier; font-size : 14pt }
140
层叠样式单(CSS) 基于class属性的选择器-收缩 通过元素的class属性来建立元素和样式规则之间的联系。
<message class = "urgent"> The sky is falling! </message> message.urgent { display : block; margin-bottom : 5px; font-family : Courier; font-size : 14pt; font-style : italic; color : red }
141
层叠样式单(CSS) 基于ID属性的选择器-扩张 通过元素的ID属性来建立元素和样式规则之间的联系。
<message id = "groovy"> I’m feeling pretty groovy! </message> #groovy { color : green; font-family : Times; font-style : italic; font-weight : bold } 注:基于class属性的选择器只能选择一种元素,而基于ID属性的选择器则不同,可以选择多种元素,只要ID属性值满足要求即可。 <note id = "groovy"> Pick up leisure suit from laundry. </note>
142
层叠样式单(CSS) CSS中的样式规则包含了许多样式属性,可以控制字体,颜色,对齐,空白等。 样式属性可以分为两种主要类型:
布局属性:影响XML内容的显示位置,如内容的显示位置,宽度,对齐等; 格式属性:控制XML内容的外观,如边界,字体等。
143
层叠样式单(CSS) 布局属性 XML文档被显示在矩形区域中,一些重要的布局属性及其属性值如下: display : 描述矩形区域的显示方法
block-元素作为新的一段,显示在新的一行上 list-item-元素显示在新的一行上,后加一个list-item标记 inline-在当前段内显示元素 none-不显示元素 width , height : 描述矩形区域的宽度和高度 in-英寸 cm-厘米 mm-毫米 pt-点(points , 1/72 inch) px-象素(pixels) display : block; width : 200px;
144
层叠样式单(CSS) position : 位置模式 left : 左偏移 right : 右偏移 top : 顶部偏移
relative-相对位置(缺省值) absolute-绝对位置 left : 左偏移 right : 右偏移 top : 顶部偏移 bottom : 底部偏移 相对位置的例子: XML文档 CSS文档 显示结果 绝对位置的例子:
145
层叠样式单(CSS) 如何对矩形区域进行空白的填充? margin-矩形区域外部的空白填充 padding-矩形区域内部的空白填充
margin-top , margin-right , margin-bottom , margin-left margin : 一个数值代表所有空白;两个数值代表top/bottom、left/right;四个数值分别代表top、right、bottom、left padding-top , padding-right , padding-bottom , padding-left padding : 含义与margin类似 空白填充的例子: margin XML文档 CSS文档 显示结果 padding XML文档 CSS文档 显示结果
146
层叠样式单(CSS) 如何处理多个重叠的元素? z-index : 第三维坐标(相对于x、y),数值大的元素显示在数值小的元素之上
重叠的例子: XML文档 CSS文档 显示结果
147
层叠样式单(CSS) text-indent : 开始文字缩进 letter-spacing : 字符间距
text-align : 水平对齐,如left , right , center vertical-align : 垂直对齐 top-元素顶部与当前行对齐 bottom-元素底部与当前行对齐 text-top-元素顶部与父元素顶部对齐 text-bottom-元素底部与与父元素底部对齐 middle-元素中部与父元素的中部对齐 sub-元素作为父元素的下标对齐 super-元素作为父元素的上标对齐 text-indent : 1.5in; letter-spacing : 5pt;
148
层叠样式单(CSS) = border : 10px dotted black 格式属性 一些重要的格式属性及其属性值如下:
border-width : 所有边界的宽度 border-color : 所有边界的颜色 border-style : 所有边界的样式,取值有solid , double , dashed , dotted , groove , ridge , outset , none(缺省值) border : 设置所有边界为相同宽度,颜色,样式 border-left : 设置左边界 border-right : 设置右边界 border-top : 设置上边界 border-bottom : 设置下边界 border-width : 10px border-style : dotted border-color : black border-left : 10px double red = border : 10px dotted black
149
层叠样式单(CSS) color : 字体的颜色 background-color : 字体的背景颜色
background-image : 设置字体的背景图,格式 : url(图像文件名) background-repeat : 背景图显示的方式,如repeat(缺省值) , repeat-x , repeat-y , no-repeat background : 设置文字的背景色,背景图,背景图显示的方式 color : black; background-color : orange; color : rgb(0 , 0 , 255); background-color : #99ff00; background : gray url(money.gif) no-repeat
150
层叠样式单(CSS) font-family : 字体 font-size : 字体大小
font-style : 字体风格,如normal(缺省值) , italic font-weight : 字体粗细,如extra-light , light , demi-light , medium(缺省值) , demi-bold , bold , extra-bold等 font : 设置文字的风格,粗细,大小,字体 font-family : Times, serif; font-size : 36pt; font-style : italic; font-weight : medium; = font : italic medium 36pt Times, serif;
151
层叠样式单(CSS) 如何将CSS应用到一个XML文档? 在XML文档中使用xml-stylesheet处理指令来实现,它包含两个属性:
type : 样式单的类型,如text/css href : 样式单的位置 <?xml-stylesheet type="text/css" href="talltales.css"?>
152
层叠样式单(CSS) 一个应用CSS的XML文档 XML文档 CSS文档 显示结果
153
扩展样式单语言(XSL) 扩展样式单语言(XSL) : eXtensible Stylesheet Language
一种基于XML的样式单语言,比CSS更加强大。 问题: XSL的功能有哪几个部分? XSL实现其功能的基本过程? XSL的功能具体是如何实现的? XSL如何应用到XML文档?
154
扩展样式单语言(XSL) XSL的功能 XSL处理器的两个基本任务: 1. 对原文档树进行转换,建造一棵结果树;
2. 对结果树进行格式化处理 在XSL分别由XSLT(XSL Transformation)和XSL-FO(XSL Formatting Objects)来完成这些功能。 XSLT和XSL-FO都是基于XML的语言。 XSLT : 将一个XML文档转化为另一个逻辑结构,如XML文档,HTML文档,XHTML文档等; XSL-FO : XSL格式化对象,可认为是CSS的一个超集,完成XML文档的显示,但是没有得到广泛支持。
155
扩展样式单语言(XSL) XSLT是XSL的转换部件,它使用样式单技术来对XML文档进行转换。
为了进行转换,XSLT使用了模式匹配技术来在XML文档中选择内容。选择出的内容使用模板中的转换逻辑进行转换。 XSLT中的一种重要技术是XPath,它是一种非XML的语言。XPath用来对XML文档结点进行定位,它是使用XSLT进行文档转换的基础。XPath不仅在XSLT中使用,在XLink和XPointer中也有应用。 <xsl : for-each select ="contacts/contact">
156
扩展样式单语言(XSL) XSL-FO是XSL的格式化部件,是CSS的一个超集,能够完成CSS的所有功能,具有自己的XML语法。
和XSLT一样,XSL-FO对树型的XML数据进行处理。所处理的XML数据可以直接来源于XML文档,也可以来源于XSLT转换来的XML文档。 XSL-FO把树中的每个结点视为一个格式化对象,对树中的结点加上属性,即相当于对XML文档中的元素应用了显示样式。 与CSS类似,XSL-FO也可以设置矩形区域,并且建立它们之间的联系。 <fo:block font-family="Arial" font-size="16pt"> This text has been styled with XSL-FO! </fo:block>
157
扩展样式单语言(XSL) XSL实现其功能的基本过程 一个XML文档被处理为一棵树后,使用XSL处理器就可以把样式单中的规则应用到这棵树上。
158
扩展样式单语言(XSL) XSL处理器处理XML文档的基本过程 Root Node Pattern Template 2 1 1 2
Result Tree Source Document Tree
159
扩展样式单语言(XSL) XSLT XSLT的基本目标是使用模式匹配技术从XML文档中挑选结点,并对它们进行转换处理。
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl=" <!-- the definitions of templates --> </xsl:stylesheet>
160
扩展样式单语言(XSL) 定义模板的基本格式:
<xsl:template match=" definition of pattern"> <!-- the definitions for transformation logic--> </xsl:template>
161
扩展样式单语言(XSL) 模式匹配的例子: <contact>
<name>Frank Rizzo</name> <address>121 W 304th Street</address> <city>New York</city> <state>New York</state> </contact> <xsl:template match="/"> … </xsl:template> <xsl:template match="state">
162
扩展样式单语言(XSL) 使用下面的xsl命名空间中的元素来定义转换逻辑: xsl:value-of-插入元素或属性的值 xsl:if-选择
xsl:choose , xsl:when , xsl:otherwise-选择 xsl:for-each-循环 xsl:sort-排序 xsl:apply-templates-应用某一个模板
163
扩展样式单语言(XSL) xsl:value-of的应用举例: All The King’s Men Atlas Shrugged
<books> <book> <title>All The King’s Men</title> <author>Robert Penn Warren</author> </book> <title>Atlas Shrugged</title> <author>Ayn Rand</author> <xsl:template match="title"> <xsl:value-of select="."/> </xsl:template> All The King’s Men Atlas Shrugged
164
扩展样式单语言(XSL) xsl:if的应用举例: <locations>
<location city="Washington" state="DC"> <description>The United States Capital</description> </location> <location city="Chicago" state="IL"> <description>The Windy City</description> </locations> <xsl:if <xsl:apply-template select="location"/> </xsl:if>
165
扩展样式单语言(XSL) xsl:choose , xsl:when , xsl:otherwise的使用
<xsl:when test=""> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose>
166
扩展样式单语言(XSL) xsl:for-each的应用举例:
<xsl:for-each select="locations/location"> <h1><xsl:value-of <h2><xsl:value-of select="description"/></h2> </xsl:for-each> <h1>Washing,DC</h1> <h2>The United States Capital</h2> <h1>Chicago,IL</h1> <h2>The Windy City</h2>
167
扩展样式单语言(XSL) xsl:sort XSLT通过使用xsl:sort元素来实现排序,排序标准由下面三个属性决定:
select-排序的目标,元素或属性的值 order-降序或升序(缺省值),descending/ascending data-type-排序数据的类型,text/number <xsl:sort select="name" order="descending" data-type="text"/>
168
扩展样式单语言(XSL) xsl:apply-templates
模板的定义 <xsl:template match="location"> … </xsl:template> 模板的调用 <xsl:apply-templates select="location"/> <xsl:apply-templates/> 注:如果模板是对根元素起作用,则此模板被自动调用。
169
扩展样式单语言(XSL) <xsl:template match="/"> </xsl:template>
Root Node <xsl:template match="/"> </xsl:template> <xsl:template match="模式12"> … <xsl:template match="/"> 1)<xsl:apply-templates/> 2)<xsl:apply-templates select="模式12"> … </xsl:template> 1 2
170
扩展样式单语言(XSL) 表达式 表达式可以完成数学计算,条件测试等功能。 表达式中可以使用的操作符和函数有:
操作符:= , != , < , <= , > , >= , and , or 函数: ceiling() , floor() , round() , sum() , count()
171
扩展样式单语言(XSL) Examples: 数学计算 <div>
Total amount=$<xsl:value-of select="round(sum(vehicles/vehicle/price) div count(vehicles/vehicle))"/> </div> 条件测试 <xsl:if test="countdown <= 0"> Lift off! </xsl:if>
172
扩展样式单语言(XSL) 对XML文档应用XSL 在XML文档中使用xml-stylesheet处理指令来实现,它包含两个属性:
type : 样式单的类型,如text/xsl href : 样式单的位置 <?xml-stylesheet type="text/xsl" href="contacts.xsl"?>
173
扩展样式单语言(XSL) 一个应用XSL的XML文档 XML文档 XSL文档 显示结果
174
XHTML 什么是XHTML?为什么会产生XHTML? XHTML和HTML之间的区别是什么? 如何创建和验证XHTML文档?
175
XHTML XHTML是一种基于XML的标记语言,用来完成HTML的功能。XHTML是HTML的继承者(XML不是)。
176
XHTML XHTML和HTML之间的主要区别: 元素和属性的名称必须小写; 对于非空元素,结束标记是必须的;
空元素使用开始标记/结束标记,或者/表示; 属性必须要有属性值; 属性值必须使用双引号; 命名空间必须在html元素中声明; head和body元素不能省略; title必须是head元素的第一个子元素;
177
XHTML XHTML最早版本是1.0,主要用于把HTML4.0解释为基于XML的标记语言。现在XHTML最新版本是2.0。
严格式(strict):不支持显示元素,如font , table <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " 过渡式(transitional):包含显示元素可以对文档进行格式化 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " 框架式(frameset):支持frame <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "
178
XHTML 创建一个可以使用工具验证的XHTML文档的步骤: 1) 在根元素前进行文档类型声明;
2) 在根元素html中使用xmlns设定XHTML命名空间; <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " <html xmlns=" xml:lang="en"> <head> <title>Skeletal XHTML Document</title> </head> <body> This is a skeletal XHTML document. </body> </html> executing
179
XHTML 把HTML转化为XHTML的方法一般是使用工具初步处理,然后手工修改。 自动转化工具:HTML Tidy
添加文档类型定义; 声明XHTML命名空间; 所有元素和属性名称小写; 开始标记和结束标记必须配对,空元素也可使用/; 所有属性都有属性值; 属性值使用双引号包围; 确定所有使用的元素和属性在XHTML DTD中都有定义;
180
XHTML HTML文档到XHTML的转化: HTML文档 显示结果 XHTML文档 显示结果
181
XLink&XPointer HTML中的链接技术 什么是XLink和XPointer?
182
XLink&XPointer 在HTML中,使用锚点来定义文档中的超文本引用。利用锚点可以将HTML文档中的某个热点链接到其他页面、同一页面的其他部分、电子邮件、ftp站点等等。锚点还可以用来定义文档的位置,以供其他锚点引用它。 锚点的标记是<A>和</A>,典型的锚点如下所示: <A HREF= <A>和</A>之间的文本是该锚点所定义的热点,HREF指定了锚点热点所链接的对象,HREF中使用的参数为URL,URL中的协议除了http以外,还可以有ftp,mailto,gopher,telnet等等。在主机域名后,还可以有Web服务器的端口号,http默认的端口号是80,如果不用默认端口号,则格式为"主机域名:端口号"。
183
XLink&XPointer 链接到其他页面的例子 HTML文档 显示结果 链接到页面不同位置的例子
184
XLink&XPointer XLink是一种使XML链接成为可能的基本技术,功能比HTML强大的多。XLink还需要XPath和XPointer的支持,三者组合在一起实现了XML链接。 XPath : 一种非XML语言,通过模式和表达式对XML文档中的内容进行定位; XPointer : 一种建立在XPath基础上的非XML语言,能够对XML文档的内部结构进行定位,换言之,它定义了创建片断标识符的语法; XLink : 一种XML语言,用来建构XML文档中的链接。 XPointer的一些例子: href="
185
XLink&XPointer XLink的一些例子:
<employees xmlns:xlink=" xlink:href="employees.xml"> Current Employees </employees> <employees xmlns:xlink= xlink:type="simple" xlink:href="employees.xml" xlink:show="replace" xlink:actuate="user" xlink:role="employees" xlink:title="Employee List">
186
XLink&XPointer 总结: 没有链接,就没有Web; HTML中使用<A>标记来实现链接;
XML提供了XLink和XPointer,是一种新的链接技术,比HTML中的链接更为复杂,功能也更为强大。
187
XML作业 假定你要到一个公司应聘Web程序设计员一职,公司需要你应用XML技术尽量详细、美观的展现你的个人经历,要求提供下列文档:
用于验证文档有效性的XSD文件; 用于显示的XSL文件; 注释文件readme.txt,说明作者姓名,使用工具等信息 提交格式:使用winrar或winzip压缩,文件名为学号,如: rar 提交日期:2005年11月20日之前
Similar presentations