XML Schema 比 DTD 更壮大。为了申明 XML Schema 机制的壮大功用,下面三个递次清单扼要比较了示意元素的差别体式格局。 清单 1给出了一个 XML 文档段, 清单 2用 DTD 语法声清楚明了这两个元素, 清单 3则是响应的 XML Schema 语法情势。要注意, 清单 3中所用的是雷同的 XML 语法。经由过程情势,考证解析器可以搜检元素 InvoiceNo 是不是是正整数,元素 ProductID 的首字符是不是为 A 到 Z 之间的字母,背面为六个阿拉伯数字。相反,援用 DTD 的考证解析器只能搜检这些元素是不是用字符串示意。
清单 1:XML 文档段
<InvoiceNo>123456789</InvoiceNo> <ProductID>J123456</ProductID>
清单 2:形貌清单 1 中元素的 DTD 段
<!ELEMENT InvoiceNo (#PCDATA)> <!ELEMENT ProductID (#PCDATA)>
清单 3:形貌清单 1 中元素的 XML Schema
<element name='InvoiceNo' type='positive-integer'/> <element name='ProductID' type='ProductCode'/> <simpleType name='ProductCode' base='string'> <pattern value='[A-Z]{1}d{6}'/> </simpleType>
在 XML Schema 中运用称号空间
在这个合作的天下中,一个人可以处置惩罚来自多个其他整体的文档,而差别的整体可以愿望以差别的体式格局示意他们的数据元素。别的,他们还可以在一个文档中援用差别整体建立的同名元素。怎样辨别雷同名字的差别定义呢?XML Schema 运用称号空间辨别这些定义。
附:
DTD 的局限性
(只管作为形貌构造化信息的一种机制,DTD 成功地为 SGML 和 HTML 开发人员效劳了 20 年,但与 XML Schema 比拟,它存在着严峻的局限性。
DTD 请求元素由以下三种身分构成:
文本字符串
文本字符串与其他子元素的夹杂
一组子元素
DTD 不运用 XML 语法,对范例和称号空间仅供应有限的支撑。)
一个给定的 XML Schema 定义了一组新名字,如元素名、范例名、属性名、属性组名,这些名字的定义和声明都写在情势中。 清单 3定义的名字包括 InvoiceNo 、 ProductID 和 ProductCode 。
我们说情势中定义的名字属于它的 目的称号空间。称号空间自身有一个牢固但没有限制的名字,必需相符 URL 语法。比方,关于 清单 3中情势段,您可以把称号空间的名字设为: http://www.SampleStore.com/Account 。
称号空间的名字语法轻易让人殽杂,只管以 http:// 最先,谁人 URL 并不指向一个包括情势定义的文件。事实上,这个 URL http://www.SampleStore.com/Account 基础没有指向任何文件,只是一个分派的名字。
情势中的定义和声明可以援用属于其他称号空间的名字。在本文中,我们称这些称号空间为 源称号空间。每一个情势都有一个目的称号空间,但可以有多个源称号空间。称号空间的名字可以相称长,但在 XML 文档中经由过程 xmlns 声明可运用简写情势。为了申明这些观点,我们可以向前述 清单 4中的示例情势中增添更多的内容。
清单 4:目的称号空间和源称号空间
<!--XML Schema fragment in file schema1.xsd--> <xsd:schema targetNamespace='http://www.SampleStore.com/Account' xmlns:xsd='http://www.w3.org/1999/XMLSchema' xmlns:ACC= 'http://www.SampleStore.com/Account'> <xsd:element name='InvoiceNo' type='xsd:positive-integer'/> <xsd:element name='ProductID' type='ACC:ProductCode'/> <xsd:simpleType name='ProductCode' base='xsd:string'> <xsd:pattern value='[A-Z]{1}d{6}'/> </xsd:simpleType>
在 清单 4的 XML Schema 中, targetNamespace 的名字是www.SampleStore.com/Account ,个中包括的名字有 InvoiceNo 、 ProductID 和 ProductCode 。 schema 、 element 、 simpleType 、 pattern 、 string 和 positive-integer 这些名字属于源称号空间 www.w3.org/1999/XMLSchema ,经由过程 xmlns 声明缩写为 xsd 。别号 xsd 没有任何特别的处所,我们可以挑选任何其他的名字。在本文背面的部份为了轻易和简化起见,我们运用 xsd 代表称号空间 www.w3.org/1999/XMLSchema ,在一些代码段中省略了限制符 xsd 。在这个例子中, targetNamespace 偶然也作为一个源称号空间,由于要运用名字 ProductCode 定义其他的名字。
清单 4中的情势段不需要指定源情势文件的位置。关于全部“情势的情势”, http://www.w3.org/1999/XMLSchema ,不需要指定位置,由于它的位置是人所共知的。关于源称号空间 www.SampleStore.com/Account ,也不需要指定位置,由于它恰好是该文件中定义的目的称号空间。为了更好地明白怎样指定情势的位置和运用默许称号空间,看一看 清单 5中扩大的例子。
清单 5:多个源称号空间,导入一个称号空间
<!--XML Schema fragment in file schema1.xsd--> <schema targetNamespace='http://www.SampleStore.com/Account' xmlns='http://www.w3.org/1999/XMLSchema' xmlns:ACC= 'http://www.SampleStore.com/Account' xmlns:PART= 'http://www.PartnerStore.com/PartsCatalog'> <import namespace='http://www.PartnerStore.com/PartsCatalog' schemaLocation='http://www.ProductStandards.org/repository/alpha.xsd'/> <element name='InvoiceNo' type='positive-integer'/> <element name='ProductID' type='ACC:ProductCode'/> <simpleType name='ProductCode' base='string'> <pattern value='[A-Z]{1}d{6}'/> </simpleType> <element name='stickyGlue' type='PART:SuperGlueType'/>
清单 5中多了一个称号空间援用: www.PartnerStore.com/PartsCatalog 。这个称号空间差别于 targetNamespace 和范例称号空间。因而必需运用 import 声明元素引入,该元素的 schemaLocation 属性指明包括情势的文件位置。默许的称号空间是www.w3.org/1999/XMLSchema ,它的 xmlns 声明没有名字。每一个非限制的名字如 schema 和 element ,都属于默许称号空间www.w3.org/1999/XMLSchema 。假如情势从一个称号空间中援用了多个名字,将其指定为默许名字空间更轻易。
一个 XML 实例文档可以援用多个称号空间的元素名,这些称号空间定义在差别情势中。为了援用和简化称号空间的名字,一样要运用 xmlns 声明。我们运用 XML Schema 实例称号空间的 schemaLocation 属性指定文件的位置。要注意,该属性差别于上一个例子中 xsd 称号空间的同名属性 schemaLocation 。
清单 6:运用来自多个情势的多个称号空间的名字
<?xml version="1.0"?> <ACC:rootElement xmlns:ACC='http://www.SampleStore.com/Account' xmlns:PART='http://www.PartnerStore.com/PartsCatalog' xmlns:xsi='http://www.w3.org/1999/XMLSchema-instance' xsi:schemaLocation='http://www.PartnerStore.com/PartsCatalog http://www.ProductStandards.org/repository/alpha.xsd http://www.SampleStore.com/Account http://www.SampleStore.com/repository/schema1.xsd'> <ACC:InvoiceNo>123456789</ACC:InvoiceNo>
图 2:清单 5 和清单 6 的称号空间
定义元素
定义元素就是定义元素的名字和内容模子。在 XML Schema 中,元素的内容模子由其范例定义,因而 XML 文档中实例元素的值必需相符情势中定义的范例。
范例包括简朴范例和庞杂范例。简朴范例的值不能包括元素或属性。庞杂范例可以发生在其他元素中嵌套元素的结果,或许为元素增添属性。(到现在为止本文中的例子都是用户定义的简朴范例,比方 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>
DTD
<Book> <Title>Cool XML<Title> <Author>Cool Guy</Author> </Book>
XML Schema
<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>
只管 表 1中的 XML 代码同时满足 DTD 与 XML Schema 段,但二者之间有一个很大的区分。在 DTD 中一切的元素都是全局性的,而表中的 XML Schema 许可把 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>
在 表 1和 清单 9所示的例子中, 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>
在 清单 11中, 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 范例就是运用情势面( pattern facet)定义的。子范例也可以向基范例增添更多的元素和属性声明。
有几种机制掌握可否定义子范例,或许可否在细致的文档中替代为子范例。比方,有可以示意 InvoiceType ( Invoice 编号的范例)不许可子范例化,任何人都不能定义新版本的 InvoiceType 。经由过程规定在特定的高低文中不能用 ProductCode 范例的子范例替代,也能表达这类束缚。
除了子范例外,还可以定义等价的范例,如许,一个范例的值可以用另一个范例替代。
经由过程声明笼统的元素或许范例,XML Schema 供应了一种强迫替代机制。
为了轻易起见,可以定义并定名属性组和元素组,从而可以在背面援用这些组到达重用的目的。
XML Schema 供应了三个元素—— appInfo 、 documentation 和 annotation ——为情势作注解,以轻易读者( documentation )和应用递次( appInfo )。
基于子元素的某些属性可以示意唯一性束缚。
可以经由过程 W3C 站点(请参阅 参考资料)的文档进一步研讨 XML Schema,或许接见 dW XML 专区相识更多的内容。现在,XML Schema 范例已被同意,并成为候选引荐范例(Candidate Recommendation),毫无疑问您将越来越多地用到它。
以上就是详解运用XML Schema定义元素的基本知识(图文)的细致内容,更多请关注ki4网别的相干文章!