旗下导航:搜·么
当前位置:网站首页 > XML教程 > 正文

详解运用XML Schema定义元素的基本知识(图文)【XML教程】,XML ,Schema,定义元素

作者:搜教程发布时间:2019-12-01分类:XML教程浏览:36评论:0


导读:新的XMLSchema体系行将成为W3C引荐范例,目的是为了战胜DTD的局限性(请参阅侧栏,DTD的局限性),为XML文档供应雄厚的语法构造。本文展现了情势...
新的 XML Schema 体系行将成为 W3C 引荐范例,目的是为了战胜 DTD 的局限性(请参阅侧栏, DTD 的局限性 ),为 XML 文档供应雄厚的语法构造。本文展现了情势的灵活性,申明怎样运用 XML Schema 体系来定义最基本的 XML 文档组织块——元素。

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网别的相干文章!

标签:XMLSchema定义元素


欢迎 发表评论: