1.05k likes | 1.27k Views
声明. 本课件仅用于北京航空航天大学计算机学院的教学; 本课件修改采用了一些网络资源(论文、研究报告、技术报告等),在采用的时候并没有准确标注引用信息。. XML Schema. 林 学 练 2001年3月18日. 内容列表. Schema 简介 理解 Schema Schema 主要内容 Schema 详细内容. I.Schema 介绍. 比较 DTD 和 Schema, 简要介绍 Schema. DTD. XML 文档实例 (学生信息) 文档实例对应的 DTD ( 学生信息) DTD 特征
E N D
声明 • 本课件仅用于北京航空航天大学计算机学院的教学; • 本课件修改采用了一些网络资源(论文、研究报告、技术报告等),在采用的时候并没有准确标注引用信息。
XML Schema 林 学 练 2001年3月18日
内容列表 • Schema简介 • 理解Schema • Schema主要内容 • Schema详细内容
I.Schema介绍 比较DTD和Schema,简要介绍Schema
DTD • XML文档实例(学生信息) • 文档实例对应的DTD(学生信息) • DTD特征 • 元素定义方式是(元素,内容模型),在定义元素的同时,指定元素内容模型 • DTD缺点 • DTD有自己的特殊的语法,其本身不是XML文档 • DTD只提供了有限的数据类型 • DTD不支持名域机制
Schema • XML文档的Schema(学生信息) • Schema特征 • Schema使用(元素,类型)模式描述文档的结构 • Schema优点 • 本身是XML文档 • 内建丰富的数据类型;可以方便地定义数据类型 • 支持名域(namespace)
小结 • Schema通过类型定义和元素声明,描述XML文档的结构。
如何理解Schema? 面向对象 以Java为参照,类比、分析Schema
Schema基本概念 – 与Java之比较 • 类型定义 • 元素声明 • Schema,名域 • XML文档
类型定义 <xsd:complexType name="StudentType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="age“ type="xsd:int“ minOccus=”0”/> </xsd:sequence> <xsd:attribute name=“sId“ type="xsd:NMTOKEN"/> </xsd:complexType> Class StudentType{ String name; int age; String sid; }
元素声明 • 元素声明: <xsd:element name=“age" type=”xsd:int”/> 对应于java中的变量声明: int age; • 属性声明: <xsd:attribute name=“b" type="xsd:NMTOKEN“ use="fixed" value="US"/> 对应于Java的变量声明 NMTOKEN b;
Schema,namespace • Schema • Java程序是类的集合,Schema是类型定义和元素声明的集合 ,因此,Schema可以类比于Java程序 • Namespace • Schema中通过元素<schema>的属性targetNamspace指定名域: targetNamespace=“http://www.example.com/PO1” Namespace对应于Java中的package,如: package cscw.mypackage;
XML文档实例 • 元素实例 • 进一步类推,可以得出XML文档的元素实例类比于Java中的类实例: student = new StudentType(); • XML文档元素与Java类实例的类比是差别最大的类比关系:前者是静态的文档,以字符形式存在;后者是程序的动态运行,以二进制形式存在于内存中。其实这个差别正是XML得以广泛应用的原因之一:二进制的数据很难在网络的不同应用之间传递,而文本数据则很容易。 • 文档实例 • XML文档实例类比于运行中的Java程序。
类型系统 • 类型 • 类型扩展 • 类型限制 • 抽象元素,抽象类型 • 控制类型派生
类型(1) • ur-type • 概念上的类型,是类型系统的根 <xsd:element name="anything" type="xsd:anyType" /> 或者 <xsd:element name="anything" /> 在实际的应用中,ur-type可以表现为anyType或者anySimpleType,分别代表复杂类型的ut-type和简单类型的ur-type。 Java类型系统中,与ur-type相对应的类是Object,Object是Java中所有类型的根类型。需要注意的是,ur-type是概念上的类型。
类型(2) • 内建类型 • Schema内部预先定义的一些数据类型 这些数据类型包括:String, CDATA , token , byte , QName ……用户可以在这些数据类型的基础上,定义自己的数据类型。 类似于JDK中定义的基本类型库。
类型(3) • 用户定义类型 • 用户通过扩展(extension)、限制(restriction)原有的类型,构造出的新的类型 在Java语言中,用户也是通过扩展(extends,即继承)机制定义数据类型(class)的。默认情况下,Java编译器认为类是从Object类继承。
类型(4) • 简单类型定义 • 对字符串或字符串代表的信息进行限制而得到的新类型。用于属性内容,或者元素的文本内容。 <xsd:simpleType name="myInteger"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="10000"/> <xsd:maxInclusive value="99999"/> </xsd:restriction> </xsd:simpleType>
类型(5) • 复杂类型定义 • 复杂类型通常包含属性集合,有自己的内容模型 <xsd:complexType name="PurchaseOrderType"> <xsd:sequence> <xsd:element name="shipTo" type="xsd:string"/> <xsd:element ref="comment" minOccurs="0"/> </xsd:sequence> <xsd:attribute name="orderDate" type="xsd:date"/> </xsd:complexType>
类型扩展(extension) • 在简单类型或者其他类型的基础上扩展 <xsd:element name="internationalPrice"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:decimal"> <xsd:attribute name="currency" type="xsd:string" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element>
类型限制(Restriction) • 限制原有类型的内容模型,构造新类型 <xsd:simpleType name="USStateList"> <xsd:list itemType="USState"/> </xsd:simpleType> <xsd:simpleType name="SixUSStates"> <xsd:restriction base="USStateList"> <xsd:length value="6"/> </xsd:restriction> </xsd:simpleType>
置换组(Substitution Group) • 使得元素实例可以被其他元素实例所置换 • 被置换的元素(属性substitutionGroup的内容ipo:comment)称作head元素,head元素必须是Schema中全局声明的元素。 • 具有相同head元素的置换元素就属于同一个置换组。 <element name="shipComment" type="string" substitutionGroup="ipo:comment" /> <element name="customerComment" type="string" substitutionGroup="ipo:comment" />
抽象类型(1) • 抽象类型 在类型定义时加上属性abstract,并赋值“true”: <complexType name="Vehicle" abstract="true"/> 可以根据抽象类型声明元素,但不能直接创建抽象类型的实例元素
抽象类型(2) 以Java的抽象类型为例: //类的定义: abstract class A {…} class B extends A{…} //变量声明 A a; /** *创建实例,创建的是派生类型(类型B)的实例对象, *接着直接赋给以父类(抽象类型A)声明的变量a。 */ a = new B();
抽象类型(3) 假定Schema中定义了抽象类型Vehicle,并由抽象类型Vehicle派生出Car <complexType name="Vehicle" abstract="true"/> <complexType name="Car"> <complexContent> <extension base="target:Vehicle"/> </complexContent> </complexType> <element name="transport" type="target:Vehicle"/> 在实例文档中不能直接创建transport元素实例,如下例子是错误的: <transport xmlns="http://cars.example.com/schema" /> 正确的表示可以是这样: <transport xmlns="http://cars.example.com/schema" xsi:type="Car"/>
控制类型派生 • Final • 属性final=”restriction”表示类不能被派生 <complexType name="Address" final="restriction"> <sequence> <element name="name" type="string"/> <element name="street" type="string"/> <element name="city" type="string"/> </sequence> </complexType> 类似于Java中的final关键字: final class MyClass{…} • Fixed,仅用于简单类型 • Block,弱于final,仅防止restriction派生
包含(include) • 将其他xsd文件的内容包含到本文件中 <include schemaLocation = "http://www.example.com/schemas/address.xsd"/> Include 只能包含同一个namespace的xsd文件,不能跨越namespace进行。 • 利用include,可以将一个Schema分成多个xsd文档
导入(Import) • 导入不同Namespace中的类型定义和元素声明 • import 元素 <import namespace="http://www.example.com/IPO"/> • 引用(reference) <element ref="xipo:comment"/> • 类型库 名域和导入机制提供了一种可能:用户可以定义自己的基本类型,接着在其基础上构造新的类型,所有这些类型构成类型库。
小结 • Schema最重要的概念是类型定义 • 理解Schema语言的关键是面向对象思想。Schema更像是高级语言 • 设计Schema的主要工作是在原有类型的基础上,派生新类型、声明元素。
Schema的主要内容 • 抽象数据模型:Schema的基础概念 • XML表示(规则):抽象数据模型在Schema中的表示 • 有效性:Schema的作用是描述XML文档信息的结构,验证XML文档的有效性
抽象数据模型 • 概念: • 抽象数据模型是个概念上的模型,类似于高级语言中的面向对象 • 组成: • 抽象数据模型由Schema部件(Schema Component,也是抽象的概念)组成,Schema部件分成三类12种。 (本文第二部分描述的类型定义的各种机制大都体现在这些Schema部件中)
Schema部件(Schema Component) • 基本部件 • 简单类型定义 • 复杂类型定义 • 属性声明 • 元素声明 • 辅助部件 • 注释(Annotation) • Model Group • Particle • Wildcard • Model group definition • Notation declaration • 次要部件 • Attribute group definition • Identity-constraint difinition
元素声明(Element Declaration) • 概念 • 部件属性 • XML表现(规则) • 例子
属性声明(Attribute Declaration) 概念 部件属性 XML表现(规则) 例子
符号声明(Notation Declaration) • 概念 • 部件属性 • XML表现(规则) • 例子
简单类型定义(Simple Type Definition) • 概念 • 部件属性 • XML表现(规则) • 例子
复杂类型定义(Complex Type Definition) • 概念 • 部件属性 • XML表现(规则) • 例子
模型组定义(Model Group Definition) • 概念 • 部件属性 • XML表现(规则) • 例子
属性组定义(Attribute Group Definition) • 概念 • 部件属性 • XML表现(规则) • 例子
模型组(Model Group) • 概念 • 部件属性 • XML表现(规则) • 例子
Particle • 概念 • 部件属性 • XML表现(规则)(无) • 例子(无)
Wildcard • 概念 • 部件属性 • XML表现(规则) • 例子
Annotation • 概念 • 部件属性 • XML表现(规则) • 例子
标识-限制定义(Identity-contraint Definition Component ) • 概念 • 部件属性 • XML表现(规则) • 例子(XML文档,Schema)
2. XML 表现(规则) • 抽象数据模型的XML表现参考“抽象数据模型” • Schema的XML表现 • XML表现(规则) • 例子
3. 有效性 • Schema的作用是描述XML文档结构,验证XML文档的有效性
比较:抽象数据模型的XML表现(规则)与文法产生式(规则)比较:抽象数据模型的XML表现(规则)与文法产生式(规则) Schema的XML表现有点类似于高级语言中的产生式规则,比如文法: <A>::=b<A>|cc 根据这个产生式规则可以构造简单的语法解析器,由机器自动分析程序的语法。 Schema部件的XML表现(规则)仅仅是功能上类似于产生式规则,它的实际形式并不是产生式,因此无法根据这些规则构造完整的解析器,由机器自动分析Schema文件。对此,Schema增加了辅助措施:约束条件。