830 likes | 1.04k Views
第 11 章 XML 技术. 第 11 章 XML 技术. 11.1 XML 的由来 11.2 XML 的语法成分 11.3 文档类型定义 11.4 XML 模式 11.5 XML 查询和转换 11.6 XML 数据的存储 11.7 小结. 前 言. 本章介绍 XML 技术, XML ( eXtensible Marrkup Language ,可扩展标记语言)是一种能够表述比其他数据模型中的数据结构化程度低的数据的语言。
E N D
第11章 XML技术
第11章 XML技术 • 11.1 XML的由来 • 11.2 XML的语法成分 • 11.3 文档类型定义 • 11.4 XML模式 • 11.5 XML 查询和转换 • 11.6 XML数据的存储 • 11.7 小结
前 言 • 本章介绍XML技术,XML(eXtensible Marrkup Language,可扩展标记语言)是一种能够表述比其他数据模型中的数据结构化程度低的数据的语言。 • XML语言开始是设计为一种用来给文本文档增加额外信息的途径,但随着在数据交换中的应用它已经变得重要起来。XML提供了一条途径来表示有嵌套结构的数据,但在数据的结构化方面允许有非常大的灵活性。 • 本章先介绍XML的形成过程,然后分别介绍XML文档的语法成分、文档类型定义(DTD)、XML模式、查询和转换、数据存储等内容。
11.1 XML的由来 • 11.1.1 从SGML、HTML到XML • 11.1.2 XML和HTML的区别 • 11.1.3 XML在数据交换中的作用
通用标记语言 GML(1969) 标准通用标记语言 SGML(1986) 超文本标记语言 HTML(1989) 扩充超文本 标记语言 可扩展标记语言 XHTML XML(1998) 11.1.1 从SGML、HTML到XML(1) 图11.1 XML的来历
11.1.1 从SGML、HTML到XML(2) • 1. GML和SGML • 在20世纪60年代末,随着出版业和文字处理技术的进步,产生了描述文档格式的标记语言,但未通用化和标准化,这在很大程度上影响了文档的交换和共享,而通用化又是标准化的前提。 • 定义11.1 标记(Markup)是指文档中任何不想用于打印输出的部分。标记语言(Markup Language)是对文档的哪部分是内容、哪部分是标记以及对这些标记的含义进行形式化描述的一种语言。
11.1.1 从SGML、HTML到XML(3) • 为此,IBM公司在1969年成立了一个小组,着手开发通用标记语言(Generalized Markup Language,简记为GML)。经过近十年的研究和发展,通用化技术已经成熟并且得到承认。1978年,ISO着手制订SGML(Standard GML)国际标准,于1986年公布了SGML标准。当时SGML主要用于大型、复杂文档(例如大型客机、电力厂的维护文档)的保存、交流和管理,应用比较局限。 • SGML不仅仅是一种标记语言,还可以认为是一种元语言。利用它可以定义各式各样的标记语言。它允许开发者根据需要制定相关的文档类型定义。但是这种灵活性带来的缺点是SGML过于复杂和庞大,需要复杂的软件去处理它。
11.1.1 从SGML、HTML到XML(4) • 2.HTML • 1989年,欧洲粒子物理研究中心的Tim Berners-Lee使用类SGML语法,开发了HTML(HyperText Markup Language,超文本标记语言)。尽管HTML语言是SGML的一个很小的子集,却是一个重要应用的开端。HTML针对SGML过于复杂的问题,指定很小的一组结构和语义标记,使其适合相对简单的文档的书写,另外还增加了对超文本的支持。
11.1.1 从SGML、HTML到XML(5) • 3.XML • HTML毕竟过于简单,不足以描述万维网(WWW)上的多样化数据,更不能支持复杂的数据交换与处理。如此发展下去,HTML标准有失控的危险。为此万维网组织W3C从两个方面着手解决这个问题:一是扩充HTML,称为XHTML;二是开发XML,取代HTML。两者都吸收了SGML中有用的成分,不过深浅有异。前者是改良,后者是变革。从长远观点看,两者将统一于XML。 • XML是SGML的一个子集,它试图将HTML的简单性与SGML的强大功能结合起来。XML原来的设计目的是为了给Web文档提供功能标记,但如今已成为应用程序间数据交换的事实上的标准化数据格式。
11.1.2 XML和HTML的区别(1) • 这里先举一个例子,再来分析XML和HTML的区别。 • 例11.1 设有关于课程和教材的记录: 课程号:CS106 课程名:数据库系统 教材名:数据库系统教程 作者:施伯乐等 出版:高等教育出版社
11.1.2 XML和HTML的区别(2) • 若用HTML,可以这样表示: <html> <p>课程号:CS106 <br>课程名:数据库系统 <br>教材名:数据库系统教程 <br>作者:施伯乐等 <br>出版:高等教育出版社 <br> </html>
11.1.2 XML和HTML的区别(3) • 若用XML,可以这样表示: <course> <course_no>课程号:CS106</course_no> <course_name>课程名:数据库系统</course_name> <text_name>教材名:数据库系统教程</text_name> <author_name>作者:施伯乐等</author_name> <publisher>出版:高等教育出版社</publisher> </course>
11.1.2 XML和HTML的区别(4) • 用HTML表示,只能表示文档的格式,而不能表示文档的内涵。 • 用XML表示,却可以表示文档的结构和内涵。 • 实际上,XML已从过去的文档标记语言发展成为文档描述语言。 • 在HTML中,文档展示格式(例如分段、字体等)或由HTML规定,或按浏览器的默认规定执行。 • 在XML中,展示格式与XML文档本身分开,用一个独立的格式单(Stylesheet)定义。用一个XML文档,对不同的用户,可以采用不同的格式单。 • XML能够通用化,就是靠上述两个措施:一是可自由扩充的标记,二是独立于文档的格式单。
11.1.2 XML和HTML的区别(5) • 1996年W3C正式成立XML工作组。1998年2月,XML1.0被W3C确认为推荐标准。长期以来,文档管理属于信息检索范畴,似乎与数据管理分开的。例如Lotus Notes系统也有文档数据库,但不是用通用的DBS实现的。实际上,文档(包括多媒体文档)属于半结构化数据。 • 半结构化数据也称为无模式数据或自描述数据。描述数据的数据称为元数据,描述数据的语言称为元语言,XML是描述文档的元语言。经元语言描述的文档也称为数据模式(Schema),但与传统的数据模式的概念有区别。
11.1.2 XML和HTML的区别(6) • 半结构化数据和对它的描述是混在一起的。它与传统的数据库不同,不是按事先定义的模式插入数据,而是先有了数据(即文档),再描述数据,经XML描述的文档,不但便于交换,可以取代EDI(Electronic Data Interchange,);而且还可以变换和查询,可以由传统的DBMS管理。 • 目前DB2、ORACLE 9i、SQL Server 2000等都增加了支持XML的功能。DBS不但可以用XML文档的形式向WWW提供其中的数据,而且还可以直接管理XML文档。XML技术使得文档管理与数据管理逐步融合,而DBS成为WWW中的数据服务中心。
11.1.3 XML在数据交换中的作用(1) • 在所有标记语言中,标记采取的形式是封闭在尖括号(<>)中的标签(Tag)。标签都成对使用,以<tag>和</tag>来界定该标签所指的文档中的某个部分的开始和结束。这在例11.1中已用到了。 • 和HTML不同,XML中不指定允许的标签集,可以根据需要对标签集进行特殊化。这项特性决定了XML在数据表示和数据交换中地位的重要性,而HTML主要应用于文档格式化。
11.1.3 XML在数据交换中的作用(2) • 与数据库中的数据存储相比,XML的表达可能效率不高,因为标签名称在整个文档中被反复使用。尽管如此,XML的表达在用于数据交换时,还是有相当大的优势,具体体现在下面三点: (1)标签使得消息是自描述的,即不需要某个模式来理解文本的含义。 (2)文档的格式不很严格。 (3)XML格式已被广泛接受,有各式各样的可用工具来辅助对它的处理,包括浏览器软件和一些数据库工具。 • 现在,SQL是关系数据库的主导查询语言,而XML正在成为数据交换的主导格式。
11.2 XML的语法成分 • 11.2.1 XML声明 • 11.2.2 元素 • 11.2.3 属性 • 11.2.4 引用 • 11.2.5 注释 • 11.2.6 名字空间 • 定义11.2 一个XML文档由序言和文档实例两个部分组成。序言包括一个XML声明和一个文档类型声明,二者都是可选的。序言之后是文档实例,它是文档的主体。
11.2.1 XML声明(XML Declaration) • XML声明是对XML文档处理的环境和要求的说明,不涉及文档本身的内容。 • 例11.2 下面是一个声明的例子: <?xml version=〞1.0〞encoding=〞UTF-8〞 standalone=〞yes〞?> • XML声明括在“<?”和“?>”之间,这个声明有三个部分。第一部分说明文档所用的XML版本,是1.0版本。第2部分表示文档所用的密码,即UTF-8,这是ISO制定的一种通用字符编码,每个字符可用8~48位编码。第三部分表示是否引用其他文档的内容,yes表示不引用其他文档的内容,即文档是独立的。 • XML标准规定,XML文档必须冠以XML声明,但内容不限,起码要有XML的版本声明。
11.2.2 元素(Element)(1) • 定义11.3 XML文档中基本的结构是元素,一个元素是简单的一对互相匹配的开始和结束标签,以及出现它们之间所有的文本。 • 元素的结构如下: <元素名> 元素内容 </元素名> 其中<元素名>为开标签,</元素名>为闭标签,两者之间为元素的内容。元素可以嵌套,嵌套的层数不受限制。最外层的元素只有一个,称为根元素。 • XML文档中的元素必须正确地嵌套,譬如: <元素1>…<元素2>…</元素2>…</元素1> • 而下面是一个不正确的嵌套。 <元素1>…<元素2>…</元素1>…</元素2>
11.2.2 元素(Element)(2) <course> <c_no>C206</c_no> <c_name>DBS</c_name> </course> <course> <c_no>C204</c_no> <c_name>OS</c_name> </course> • 例11.3 下面是学生与课程 联系信息的表示: <university> <student> <s_no>S246</s_no> <s_name>LIU</s_name> <s_age>22</s_age> <s_sex>男</s_sex> </student> <student> <s_no>S369</s_no> <s_name>WEN</s_name> <s_age>21</s_age> <s_sex>女</s_sex> </student>
11.2.2 元素(Element)(3) <sc> <s_no>S246</s_no> <c_no>C206</c_no> <score>85</score> </sc> <sc> <s_no>S369</s_no> <c_no>C204</c_no> <score>100</score> </sc> </university>
11.2.2 元素(Element)(4) <student> <s_no>S369</s_no> <s_name>WEN</s_name> <s_age>21</s_age> <s_sex>女</s_sex> <course> <c_no>C204</c_no> <c_name>OS</c_name> <score>100</score> </course> </student> </university_1> • 例11.4下面是course元素嵌套在student元素中: <university_1> <student> <s_no>S246</s_no> <s_name>LIU</s_name> <s_age>22</s_age> <s_sex>男</s_sex> <course> <c_no>C206</c_no> <c_name>DBS</c_name> <score>85</score> </course> </student>
11.2.3 属性(Attribute)(1) • 在XML中,对元素还可以指定属性。属性包括属性名及属性值。属性名是个标记,属性值用引号括起。属性名与属性值以等号相连。属性一律放在开标签中。 • 例11.5 在例11.3中,s_no和s_name可改用属性表示,则元素student可用下列形式表示: <student s_no=〞S246〞 s_name=〞LIU〞> <s_age>22</s_age> <s_sex>男</s_sex> </student> • 应注意,在文档构造上下文中,属性是隐式地不出现在文档的打印或显示文档中的文本。但是在DB和XML的数据交换应用程序中,这种区别不很明显,并且可随意选择将数据表示为属性还是子元素。
11.2.3 属性(Attribute)(2) • 但在XML中并不是在所有情况下都可以用属性代替子元素,它们之间至少有两点差别:① 在同一元素中,其属性不能重名,但它的子元素可以重名;②属性在书写时虽然有先后,但其次序是无关紧要的,而子元素按书写次序排序。 • 一般来讲,凡是元素的组成部分宜用子元素表示,凡表示元素性质的内容宜用属性表示;简短的内容宜用属性表示,嵌套或较长内容宜用子元素表示。 • 定义11.6 没有内容只有属性的元素称为空元素 (Empty Element)。 • 例如<s_name=〞WEN〞> </s_name>就是一个空元素,该空元素也可简写为 <s_name=〞WEN〞/>。
11.2.4 引用(References) • 在编写XML文档时,常常要重用本文档或其他文档的内容。可将拟重用的内容定义为Entity,其格式如下: <! Entity 引用名 〞引用元素〞> • <! …>是XML的定义语句格式,<! Entity …>是一条定义Entity的语句。引用名是引用内容的名字,在引用时,只须在引用处填上“&引用名;”即可。引用内容可以是任意内容,例如可以是HTML文档、图形、声音、影视等。这些内容中可能包含XML中有特定含义的符号,引用内容可包装成如下形式: <! [ CDATA [ 引用内容 ] ] > 开标签 闭标签 • 引用内容经处理后,Entity定义可表示为: <! Entity 引用名 〞<! [ CDATA [ 引用内容 ] ] >〞>
11.2.5 注释(Comments) • XML文档在需要时可随处加上注释。注释的格式如下: <! --注释--> • 注释仅供人阅读,机器在处理XML文档时予以忽略。注释可以是任意内容,但其中不得含有“--”字符串。
11.2.6 名字空间(Name Space)(1) • 引入了“名字空间”机制以允许一些组织机构指定全局惟一的名字(譬如网址)作为文档中的元素标签使用。 • 举例来说,如果复旦大学想确保它创建的XML文档中的标签不全与其他业务伙伴的XML文档中的标签重复,它可以预先考虑每个标签名称上带有一个冒号的惟一标识符。复旦大学可以使用一个Web URL,例如: http://www.fudan.edu.cn 作为一个惟一标识符。每个标签中使用这样的长惟一标识符是很不方便的,所以名字空间标准提供了一种定义标识符缩写的方法。
11.2.6 名字空间(Name Space)(2) • 例11.7 下面的代码通过使用名字空间获得惟一标签名: <university xmlns:FD=〞http://www.fudan.edu.cn〞> …… <FD:department> <FD:dept_name>Finance Department</FD:dept_name> <FD:dept_manager>Guo Ning</FD:dept_manager> </FD:department> …… </university> • 定义11.5 符合下列条件的XML文档称为合式(Well Formed)XML文档: ① 开头有XML声明; ② 有且仅有一个根元素; ③ 开标签与闭标签正确地匹配。
11.3 文档类型定义 • 11.3.1 元素类型空间 • 11.3.2 属性声明 • 11.3.3 DTD的局限性 • 定义11.6 文档类型定义(Document Type Definition,DTD)是对XML文档的结构和约束的定义。
11.3.1 元素类型声明(1) • 例11.7 下面是学生与课程信息文档的DTD示例中的一部分。 <! DOCTYPE university_1 [ <! ELEMENT university ((student|course|sc) *)> <! ELEMENT student (s_no,s_name,s_age,s_sex)> <! ELEMENT course (c_no,c_name)> <! ELEMENT sc(s_no,c_no,score)> <! ELEMENT s_no(#PCDATA)> <! ELEMENT s_name(#PCDATA)> <! ELEMENT s_age(#PCDATA)> <! ELEMENT s_sex(#PCDATA)> <! ELEMENT c_no(#PCDATA)> <! ELEMENT c_name(#PCDATA)> <! ELEMENT score(#PCDATA)> ] >
11.3.1 元素类型声明(2) • 这里,一个university元素包含一个或多个student、course或sc元素。操作符有 “*”、“|” 、“+”、“?”。 • student元素定义为包含子元素s_no、s_name、s_age和s_sex(按顺序)。同样,course和sc在模式中将它们的属性定义为子元素。随后,这些子元素都被声明为类型#PCDATA。关键字#PCDATA表示文本数据。 • 元素还可以有另外两种特殊类型声明:EMPTY和ANY。EMPTY表示这个元素没有内容,通常用属性来表示某些参数。ANY是说对这个元素的子元素没有任何的限制,可以出现任何内容,甚至在DTD中未提及的元素,也可以作为该元素的子元素出现。一个元素缺少声明就等同于将这个元素显式地声明为类型ANY。
11.3.2 属性声明(1) • 每个元素中的属性也在DTD中声明。与子元素不同,属性没有顺序之分。属性声明以“<! ATTLIST”开始,以“>”结束,中间是元素名称和属性定义。其定义的属性名称、属性类型和默认值三部分组成。属性必须有一个类型声明和一个默认声明。 • 类型声明是对属性指定为下面五种类型之一: ·PCDATA或CDATA:不含有XML中有特定意义的字符串,或者免除语法分析的字符串。 ·ID:该属性提供为元素的惟一的标识符。 ·IDREF或IDREFS:属性值是其他元素或本元素的ID。此属性值可能是多值,值间用空格分开。 ·ENTITY或ENTITIES:属性值是引用名,可能是多值,值间以空格分开。 ·枚举类型:在列举的值中取其一。
11.3.2 属性声明(2) • 默认声明可以包含该属性的一个默认值,也可以指定为下面三种类型之一: ·#IMPLIED:表示该属性是可选的,既可以要,也可以不要。 ·#REQUIRED:表示该属性是必需的,若缺少属性值,则取默认值,但默认值无须在定义中标明。 ·#FIXED:表示该属性是必需的,若缺少属性值,则取其默认值,但默认值必须在定义中标明。 • 例11.9 对于例11.4中文档的嵌套表示方法,现在采用引用方式,并在student元素中可引用course元素,在course元素中可引用student元素,具有ID和IDREF属性类型的DTD如下表示:
11.3.2 属性声明(3) <! DOCTYPE university_2 [ <! ELEMENT student (s_name,s_age,s_sex,s_courses)> <! ELEMENT s_courses (s_c*)> <! ELEMENT s_c (score)> <! ELEMENT course (c_name,c_students)> <! ELEMENT c_students (c_s*)> <! ELEMENT c_s (score)> <! ATTLIST student s_no ID #REQUIRED> <! ATTLIST s_c c_id IDREF #REQUIRED> <! ATTLIST course c_no ID #REQUIRED> <! ATTLIST c_s s_id IDREF #REQUIRED> <! ELEMENT s_name(#PCDATA)> <! ELEMENT s_age(#PCDATA)> <! ELEMENT s_sex(#PCDATA)> <! ELEMENT c_name(#PCDATA)> ] >
11.3.2 属性声明(4) • 下面是基于上述DTD的XML文档例子:<university_2> <student s_no=〞S246〞> <s_name>LIU</s_name> <s_age>22</s_age> <s_sex>男</s_sex> <s_courses> <s_c> <c_id>C206</c_id> <score>85</score> </s_c> </s_courses> </student>
11.3.2 属性声明(5) <student s_no=〞S369〞> <s_name>WEN</s_name> <s_age>21</s_age> <s_sex>女</s_sex> <s_courses> <s_c> <c_id>C204</c_id> <score>100</score> </s_c> </s_courses> </student>
11.3.2 属性声明(6) <course c_no=〞C206〞> <c_name>DBS</c_name> <c_students> <c_s> <s_id>S246</s_id> <score>85</score> </c_s> </c_students> </course> <course c_no=〞C204〞> <c_name>OS</c_name> <s_students> <c_s> <s_id>S369</s_id> <score>100</score> </c_s> </c_students> </course> </university_2>
11.3.3 DTD的局限性 • DTD与XML的文档格式化继承有很强的联系。由于这个原因,将DTD作为数据处理应用中的XML类型结构来使用在很多方面是不合适的。尽管如此,大量的数据交换格式是以DTD来定义的,这是因为它们是最初标准的一部分。 • 以DTD作为模式的局限性有以下三点: (1)个别的元素和属性不能更进一步归类。 (2)很难用DTD机制来指定子元素的无序集合。 (3)对于IDREF或IDREFS的属性未指明引用哪一个元素类型的机制。 • 这样,在例11.8中就有可能student元素中引用到student元素,这就无意义了。
11.4 XML模式 • 11.4.1 XML模式的示例 • 11.4.2 XML模式的基本成分 • 11.4.3 XML模式的优点
11.4.1 XML模式的示例(1) • XML中DTD明显地刻着SGML的烙印。关键是,DTD本身并不是XML,而且它只提供了非常有限的数据类型,也不支持名字空间,另外DTD中的内容模型是不开放的,不能随意扩充内容。为此,W3C组织推荐了一个XML模式标准,以弥补DTD的不足,作为检查XML文档正确性的依据。 • XML模式与传统的数据模式有区别。XML模式是从XML文档中抽象出来的,先有XML文档,后有XML模式,它主要用于正确性检查。 • 在XML模式中先说明文档中所用的名字空间,然后用XML文档的语法定义元素、主键和外键。下面先举例,然后详细地解释。
11.4.1 XML模式的示例(2) • 例11.9 下面是来自例11.8中的DTD的XML模式: <? xml version=〞1.0〞encoding=〞UTF-8〞?> <schema xmlns:xsd=〞http://www.w3.org/2001/XML Schema〞 xmlns:xsd=〞http://www.fudan.edu.cn/university〞> <! --定义匿名类型元素university--> <element name=〞university〞type=〞universityType〞/> <complexType> <sequence> <element name=〞student〞 type=〞rgt:studentType〞 minOccurs=〞0〞 maxOccurs=〞unbounded〞/> <element name=〞course〞 type=〞rgt:courseType〞 minOccurs=〞0〞 maxOccurs=〞unbounded〞/> </sequence> </complexType>
11.4.1 XML模式的示例(3) <! --定义类型studentType--> <complexType name=〞studentType〞> <sequence> <element name=〞s_name〞 type=〞rgt:string〞/> <element name=〞s_age〞 type=〞rgt:integer〞/> <element name=〞s_sex〞 type=〞rgt:setType〞/> <element name=〞s_courses〞 type=〞rgt:courseNoType〞 minOccurs=〞0〞 maxOccurs=〞12〞/> </sequence> <attribute name=〞s_no〞 type=〞rgt:studentNoType〞/> <! --定义主键--> <key name=〞studentKey〞> <selector XPath=〞student〞/> <field XPath=〞@s_no〞/> </key> <! --定义外键--> <keyref name=〞courseRef〞 refer=〞courseKey〞> <selector XPath=〞student/s_courses〞/> <field XPath=〞text(s_courses)〞/> </keyref> </complexType>
11.4.1 XML模式的示例(4) <! --定义类型courseType--> <complexType name=〞courseType〞> <sequence> <element name=〞c_name〞 type=〞rgt:string〞/> <element name=〞c_students〞 type=〞rgt:studentNoType〞/> minOccurs=〞0〞 maxOccurs=〞100〞/> </sequence> <attribute name=〞c_no〞 type=〞rgt:courseNoType〞/> <! --定义主键--> <key name=〞courseKey〞> <selector XPath=〞course〞/> <field XPath=〞@c_no〞/> </key> <! --定义外键--> <keyref name=〞studentRef〞 refer=〞studentKey〞> <selector XPath=〞course/c_students〞/> <field XPath=〞text(c_students)〞/> </keyref> </complexType>
11.4.1 XML模式的示例(5) <! –以下定义类型simpleType--> <simpleType name=〞setType〞> <restriction base=〞string〞> <enumeration value=〞男〞/> <enumeration value=〞女〞/> </restriction> </simpleType> <simpleType name=〞courseNoType〞> <restriction base=〞string〞> <pattern value=〞[A~Z]{1}-[0~9]{3}〞/> </restriction> </simpleType> <simpleType name=〞studentNoType〞> <restriction base=〞string〞> <pattern value=〞[A~Z]{1}-[0~9]{3}〞/> </restriction> </simpleType> </schema>
11.4.2 XML模式的基本成分(1) • XML模式的基本成分有名字空间、元素、主键、外键等。下面一一叙述。 • 1.名字空间 • 在XML模式定义中,必须说明文档中所用的名字空间。 • 一个模式可以有多个名字空间。但只有一个基本名字空间可以选作默认名空间,凡未说明的都是属于默认名空间,在例11.9中,用了两个名字空间:xsd和rgt。其中xsd是W3C组织公布的一个xmlns子名字空间。凡是属于这个名字空间的标签和类型,可冠以“xsd:”。后一个名字空间rgt是复旦大学的名字空间,简称为rgt,也是xmlns的一个子名字空间,凡是属于这个名字空间的标签或类型至少在第一次出现时,都要加上“rgt:”说明。
11.4.2 XML模式的基本成分(2) • 2.元素 • XML模式用XML文档的语法定义元素。属性作为元素的一部分附在元素定义中。元素定义有复合类型(Complex Type)和简单类型(Simple Type)之分。如果元素含有子元素或属性,则其定义称为复合类型,否则称为简单类型。空元素含有属性,因而其定义也算复合类型。 • XML模式与XML文档一样,也是以XML声明开始。然后用<schema…> … </schema> 将整个模式定义括一起,以区别于一般的XML文档。 • 不管是复合还是简单类型,元素定义的基本格式如下: <element name=〞元素名〞 type=〞类型名〞/>
11.4.2 XML模式的基本成分(3) • (1)复合类型的定义 • 模式定义从根开始。根是个复合类型。 • ·复合类型定义用<complexType>…</complexType>括起,其中包含子元素定义和属性定义。 • ·子元素定义用<sequence>…</sequence>括起。 • ·属性定义附在子元素定义之后,无次序之分,其格式为: <attribute name=〞属性名〞 type=〞属性值类型〞/> • 与DTD不同,属性定义附在其所属的元素定义之中,故可省去其中的所属元素名。 • 在XML模式中规定,在复杂类型定义中即使只有一种子元素,也要用<sequence>…</sequence>括起。
11.4.2 XML模式的基本成分(4) • (2)简单类型的定义 • 简单类型是在xsd、rgt等名字空间所支持的基本类型(譬如integer、float、decimal、string、booleam、date等)的基础上所定义的特殊类型。并可再加各式各样的限制条件从基本类型导出的各种简单类型。 • 譬如courseNoType用模板[A~Z]{1}-[0~9]{3}限制字符串,表示课程号由一个大写英文字母、连字符、三位十进制数字组成。setType是枚举类型,限制在男、女两个汉字上。
11.4.2 XML模式的基本成分(5) • 3.主键和外键 • 在XML模式中,主键和外键主要用于实体完整性和参照完整性约束的检查。在例11.9中,在元素student中定义主键s_no,且在元素course中用作外键;另一方面,在元素course中定义主键c_no,而在元素student中用作外键。 • 而在XML中,由于元素是树形结构,不但有属性,其中还可能有多层子元素。XML的主键和外键不但来自属性,也可来自元素及其子元素的内容;不但来自本元素的内容及其属性,也可来自它的各层子元素的内容及其属性。为此,主键和外键必须用一组树形路径表示。这种用来定位主键和外键成员的路径,称为XPath。