使用 XML Schema 定义元素的基本知识--2
2008-10-18 23:35
302 查看
定义元素
定义元素就是定义元素的名字和内容模型。在 XML Schema 中,元素的内容模型由其类型定义,因此 XML 文档中实例元素的值必须符合模式中定义的类型。
类型包括简单类型和复杂类型。简单类型的值不能包含元素或属性。复杂类型可以产生在其他元素中嵌套元素的效果,或者为元素增加属性。(到目前为止本文中的例子都是用户定义的简单类型,比如
简单的、非嵌套的元素是简单类型
不含属性或其他元素的元素可以定义为简单类型,无论是预定义的简单类型还是用户定义的简单类型,如
清单 7:一些元素的简单类型
带有属性的元素必须是复杂类型
现在,试着向 清单 7中的简单元素
清单 8:一个复杂元素类型
嵌入其他元素的元素必须是复杂类型
在 XML 文档中,一个元素可能嵌入其他的元素。这种要求可以在 DTD 中直接表示。但 XML Schema 定义一个元素,这个元素有一个类型,而这个类型可以包含其他元素和属性的声明。 表 1给出了一个简单的例子。
表 1:DTD 和 XML Schema 中复杂数据类型的比较
XML 文档
DTD
XML Schema
尽管 表 1中的 XML 代码同时满足 DTD 与 XML Schema 片段,但两者之间有一个很大的区别。在 DTD 中所有的元素都是全局性的,而表中的 XML Schema 允许把
清单 9:用全局简单类型定义的复杂类型
在 表 1和 清单 9所示的例子中,
清单 10:隐藏 BookType 作为本地类型
表示元素的复杂约束
对于表示元素内容模型的约束,XML Schema 比 DTD 提供了更大的灵活性。在最简单的层次上,像在 DTD 中那样,您可以把属性和元素声明关联起来,指明能够出现的给定元素集合序列:只能出现 1 次(1)、出现 0 次或多次(*)或者出现 1 次或多次(+)。您还可以表示 XML Schema 中的其他约束,比方说使用
清单 11:表示元素类型的约束
在 清单 11中,
清单 12:指出必须为元素定义所有的类型
更上层楼
我们已经讨论了在 XML Schema 中定义元素所需的最基本的概念,通过一些简单的例子使您领略到它的强大功能。还有一些更强大的机制:
XML Schema 对类型继承提供了广泛的支持,允许重用以前定义的结构。使用所谓的 facets,您可以派生新的类型,表示其他某个类型值的更小子集,比如通过枚举、范围或模式匹配来定义子集。在本文的例子中,
有几种机制控制能否定义子类型,或者能否在具体的文档中替换为子类型。比如,有可能表示
除了子类型外,还可以定义等价的类型,这样,一个类型的值可以用另一个类型代替。
通过声明抽象的元素或者类型,XML Schema 提供了一种强制替换机制。
为了方便起见,可以定义并命名属性组和元素组,从而能够在后面引用这些组达到重用的目的。
XML Schema 提供了三个元素——
基于子元素的某些属性可以表示惟一性约束。
定义元素就是定义元素的名字和内容模型。在 XML Schema 中,元素的内容模型由其类型定义,因此 XML 文档中实例元素的值必须符合模式中定义的类型。
简单类型 XML Schema 规范定义了一些值的简单类型,如 表 2:“预定义的值简单类型”所示。 |
ProductCode)。XML Schema 规范也包括预定义的简单类型(请参阅侧栏 简单类型)。 派生的简单类型约束了基类型的值。比如,派生简单类型
ProductCode的值是基类型
string值的子集。
简单的、非嵌套的元素是简单类型
不含属性或其他元素的元素可以定义为简单类型,无论是预定义的简单类型还是用户定义的简单类型,如
string、
integer、
decimal、
time、
ProductCode等等。
清单 7:一些元素的简单类型
<element name='age' type='integer'/> <element name='price' type='decimal'/> |
现在,试着向 清单 7中的简单元素
price增加属性
currency。您不能这样做,因为简单类型的元素不能有属性。如果希望增加属性,您必须把
price元素定义成复杂类型。在 清单 8的例子中,我们定义了一个 匿名类型,没有明确地命名这个复杂类型。换句话说,没有定义复杂类型
complexType的
name属性。
清单 8:一个复杂元素类型
<element name='price'> <complexType base='decimal' derivedBy='extension'> <attribute name='currency' type='string'/> </complexType> </element> <!-- In XML instance document, we can write: <price currency='US'>45.50</price> --> |
在 XML 文档中,一个元素可能嵌入其他的元素。这种要求可以在 DTD 中直接表示。但 XML Schema 定义一个元素,这个元素有一个类型,而这个类型可以包含其他元素和属性的声明。 表 1给出了一个简单的例子。
表 1:DTD 和 XML Schema 中复杂数据类型的比较
XML 文档
<Book> <Title>Cool XML<Title> <Author>Cool Guy</Author> </Book> |
<Book> <Title>Cool XML<Title> <Author>Cool Guy</Author> </Book> |
<Book> <Title>Cool XML<Title> <Author>Cool Guy</Author> </Book> |
<!ELEMENT Book (Title, Author)> <!ELEMENT Title (#PCDATA)> <!ELEMENT Author (#PCDATA)> |
<element name='Book' type='BookType'/> <complexType name='BookType'> <element name='Title' type='string'/> <element name='Author' type='string'/> </complexType> |
Title和
Author定义成局部的——只出现在元素
Book中。为了在 XML Schema 中实现与 DTD 声明完全相同的效果,元素
Title和
Author必须是全局范围的,如 清单 9中所示。元素
element的
ref属性使您能够引用前面声明的元素。
清单 9:用全局简单类型定义的复杂类型
<element name='Title' type='string'/> <element name='Author' type='string'/> <element name='Book' type='BookType'/> <complexType name='BookType'> <element ref='Title'/> <element ref='Author'/> </complexType> |
BookType是全局性的,可用于声明其他元素。相反, 清单 10将该类型局部地定义到元素
Book中,而且定义成匿名元素。要注意, 表 1中的 XML 文档片段与表 1、 清单 9和 清单 10中三个模式片段都匹配。
清单 10:隐藏 BookType 作为本地类型
<element name='Title' type='string'/> <element name='Author' type='string'/> <element name='Book'> <complexType> <element ref='Title'/> <element ref='Author'/> </complexType> </element> |
对于表示元素内容模型的约束,XML Schema 比 DTD 提供了更大的灵活性。在最简单的层次上,像在 DTD 中那样,您可以把属性和元素声明关联起来,指明能够出现的给定元素集合序列:只能出现 1 次(1)、出现 0 次或多次(*)或者出现 1 次或多次(+)。您还可以表示 XML Schema 中的其他约束,比方说使用
element元素的
minOccurs和
maxOccurs属性,以及
choice、
group和
all元素。
清单 11:表示元素类型的约束
<element name='Title' type='string'/> <element name='Author' type='string'/> <element name='Book'> <complexType> <element ref='Title' minOccurs='0'/> <element ref='Author' maxOccurs='2'/> </complexType> </element> |
Book中
Title的出现是可选的(类似 DTD 的 '?')。但是, 清单 11也说明
Book元素中至少要有一个但不能超过两个作者。
element的
minOccurs和
maxOccurs属性的默认值是 1。元素
choice只允许它的一个子女出现在实例中。另外一个元素
all,表示这样的约束:组中的所有子元素可以同时出现一次,或者都不出现,它们可以按任意的顺序出现。 清单 12表示
Title和
Author两者必须同时出现(顺序任意)在
Book中,或者都不出现。这种约束很难在 DTD 中表示。
清单 12:指出必须为元素定义所有的类型
<xsd:element name='Title' type='string'/> <xsd:element name='Author' type='string'/> <xsd:element name='Book'> <xsd:complexType> <xsd:all> <xsd:element ref='Tile'/> <xsd:element ref='Author'/> </xsd:all> </xsd:complexType> </xsd:element> |
我们已经讨论了在 XML Schema 中定义元素所需的最基本的概念,通过一些简单的例子使您领略到它的强大功能。还有一些更强大的机制:
XML Schema 对类型继承提供了广泛的支持,允许重用以前定义的结构。使用所谓的 facets,您可以派生新的类型,表示其他某个类型值的更小子集,比如通过枚举、范围或模式匹配来定义子集。在本文的例子中,
ProductCode类型就是使用模式面(
patternfacet)定义的。子类型也可以向基类型增加更多的元素和属性声明。
有几种机制控制能否定义子类型,或者能否在具体的文档中替换为子类型。比如,有可能表示
InvoiceType( Invoice 编号的类型)不允许子类型化,任何人都不能定义新版本的
InvoiceType。通过规定在特定的上下文中不能用
ProductCode类型的子类型替换,也能表达这种约束。
除了子类型外,还可以定义等价的类型,这样,一个类型的值可以用另一个类型代替。
通过声明抽象的元素或者类型,XML Schema 提供了一种强制替换机制。
为了方便起见,可以定义并命名属性组和元素组,从而能够在后面引用这些组达到重用的目的。
XML Schema 提供了三个元素——
appInfo、
documentation和
annotation——为模式作注解,以方便读者(
documentation)和应用程序(
appInfo)。
基于子元素的某些属性可以表示惟一性约束。
相关文章推荐
- 使用 XML Schema 定义元素的基本知识
- 使用 XML Schema 定义元素的基本知识
- 使用 XML Schema 定义元素的基本知识
- 使用 XML Schema 定义元素的基本知识
- 使用 XML Schema 定义元素的基本知识--1
- 指针知识梳理1-变量基本定义及使用
- Dom元素基本操作方法API,先记录下,方便以后使用。 W3C DOM和JavaScript很容易混淆不清。DOM是面向HTML和XML文档的API,为文档提供了结构化表示,并定义了如何通过脚本
- html内联元素和块级元素的基本概念及使用示例
- 使用jquery.offset获取元素的坐标时最好要事先定义宽高!
- 03.java语言基础-变量的定义和基本使用
- Android AIDL(安卓接口定义语言)基本使用方法
- webrtc中的基本类型定义,以后可以当库使用
- 用scheme最基本的元素定义排序函数
- 【软件工程技术之程序版本控制】SVN的使用——基本知识,Server搭建与Client日常使用维护
- struts2之使用JSON插件实现Ajax(JSON基本知识)
- Vue——路由定义及基本使用
- 使用Delphi来跟我学COM (第一部 基本知识)
- 【Android基础知识】ViewPager基本使用
- 今日内容介绍 1、自定义类型的定义及使用 2、自定义类的内存图 3、ArrayList集合的基本功能 4、随机点名器案例及库存案例代码优化 ###01引用数据类型_类 * A: 数据类型
- 基本知识的使用