XSD(XML模式定义)是互联网联盟推荐的,它规定了可扩展标记语言(XML)文件中的元素的描述方式。这一描述可用来验证文件内容中各个项目与其内容将被取代的元素的描述是否一致。
概述
XML模式表示XML对象(例如,文件或文件的一部分)的属性及元素之间的相互关系。创建一个文件的模式,需要分析其结构并定义所碰到的各个结构元素。与XML和HTML一样,元素是在标记符集合的范围内定义的。
与文件类型定义(DTD)或简单对象XML(SOX)等早期的XML模式语言相比,XSD具有几个优点。例如,它更直接,它不需要语法分析器的中间处理,其它优点包括自文档、自动模式创建以及可通过XML变换(XSLT)来查找的能力。然而,尽管XSD有其优点,有些批评者声称其语言不必那么复杂。
语法
我们需要在 XML 文档中声明模式,如下所示:
\u003cxs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"\u003e
示例
下面的示例展示了如何使用模式:
\u003c?xmlversion="1.0"encoding="UTF-8"?\u003e
\u003cxs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema"\u003e
\u003cxs:elementname="contact"\u003e
\u003cxs:complexType\u003e
\u003cxs:sequence\u003e
\u003cxs:elementname="name"type="xs:string"/\u003e
\u003cxs:elementname="company"type="xs:string"/\u003e
\u003cxs:elementname="phone"type="xs:int"/\u003e
\u003c/xs:sequence\u003e
\u003c/xs:complexType\u003e
\u003c/xs:element\u003e
\u003c/xs:Schema\u003e
XML 模式背后的基本思想就是描述 XML 文档可以接受的合法格式。
元素
正如我们在 XML 元素 一章中所看到的,元素就是 XML 文档构建块。在XSD内可以像下面这样定义元素:
\u003cxs:elementname="x"type="y"/\u003e
定义类型
我们可以按照以下方式定义 XML 模式元素:
简单类型:简单类型的元素只能用于文本上下文中。一些预定义的简单类型有:xs:integer,xs:boolean,xs:string,xs:data。例如:
\u003cxs:elementname="phone_number"type="xs:int"/\u003e
复杂类型:复杂类型就是其他元素定义的容器。允许我们指定哪个元素可以包含子元素以便为 XML 文档提供一些结构。例如:
\u003cxs:elementname="Address"\u003e
\u003cxs:complexType\u003e
\u003cxs:sequence\u003e
\u003cxs:elementname="name"type="xs:string"/\u003e
\u003cxs:elementname="company"type="xs:string"/\u003e
\u003cxs:elementname="phone"type="xs:int"/\u003e
\u003c/xs:sequence\u003e
\u003c/xs:complexType\u003e
\u003c/xs:element\u003e
上面的例子中,Address 元素由子元素组成。它是其他 \u003cxs:element\u003e 定义的容器,允许我们在 XML 文档中构建一个简单的层级元素。
全局类型:对于全局类型,我们可以在文档中定义独立的类型,它还可以使用所有其他引用。例如,假设我们想针对不同的公司地址概括 person 和 company。这种情况下,我们可以定义一个如下所示的通用类型:
\u003cxs:elementname="AddressType"\u003e
\u003cxs:complexType\u003e
\u003cxs:sequence\u003e
\u003cxs:elementname="name"type="xs:string"/\u003e
\u003cxs:elementname="company"type="xs:string"/\u003e
\u003c/xs:sequence\u003e
\u003c/xs:complexType\u003e
\u003c/xs:element\u003e
然后在下面的示例中使用这个类型:
\u003cxs:elementname="Address1"\u003e
\u003cxs:complexType\u003e
\u003cxs:sequence\u003e
\u003cxs:elementname="address"type="AddressType"/\u003e
\u003cxs:elementname="phone1"type="xs:int"/\u003e
\u003c/xs:sequence\u003e
\u003c/xs:complexType\u003e
\u003c/xs:element\u003e
\u003cxs:elementname="Address2"\u003e
\u003cxs:complexType\u003e
\u003cxs:sequence\u003e
\u003cxs:elementname="address"type="AddressType"/\u003e
\u003cxs:elementname="phone2"type="xs:int"/\u003e
\u003c/xs:sequence\u003e
\u003c/xs:complexType\u003e
\u003c/xs:element\u003e
不再需要定义 name 和 compacny 两次(一次是给 Address1,一次给 Address2),现在我们拥有一个独立的定义。这让维护变得更简单,例如,如果我们决定给地址添加一个 "Postcode" 元素,只需要在一个地方添加即可。
属性
XSD中的属性提供了元素的额外信息。带 name 和 type 属性(property)的属性(attribute)如下所示:
\u003cxs:attributename="x"type="y"/\u003e