XML - 架构

XML Schema通常称为 XML架构定义(XSD).它用于描述和验证XML数据的结构和内容. XML模式定义元素,属性和数据类型. Schema元素支持Namespaces.它类似于描述数据库中数据的数据库模式.

语法

您需要在XML文档中声明一个模式,如下所示 :

示例

以下示例显示如何使用schema :

<?xml version = "1.0" encoding = "UTF-8"?>
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema">
   <xs:element name = "contact">
      <xs:complexType>
         <xs:sequence>
            <xs:element name = "name" type = "xs:string" />
            <xs:element name = "company" type = "xs:string" />
            <xs:element name = "phone" type = "xs:int" />
         </xs:sequence>
      </xs:complexType>
   </xs:element>
</xs:schema>

XML Schemas背后的基本思想是它们描述了XML文档可以采用的合法格式.

元素

正如我们在 XML  -  Elements 章节中看到的那样,元素是XML的构建块文献.元素可以在XSD中定义如下 :

<xs:element name = "x" type = "y"/>

定义类型

您可以通过以下方式定义XML架构元素 :

简单类型

简单类型元素仅在文本的上下文中使用.一些预定义的简单类型是:xs:integer,xs:boolean,xs:string,xs:date.例如 :

<xs:element name = "phone_number" type = "xs:int" />

复杂类型

复杂类型是其他元素定义的容器.这允许您指定元素可以包含哪些子元素,并在XML文档中提供一些结构.例如 :

<xs:element name = "Address">
   <xs:complexType>
      <xs:sequence>
         <xs:element name = "name" type = "xs:string" />
         <xs:element name = "company" type = "xs:string" />
         <xs:element name = "phone" type = "xs:int" /> 
      </xs:sequence> 
   </xs:complexType>
</xs:element>

在上面的例子中, Address 元素由子元素组成.这是其他< xs:element> 定义的容器,允许在XML文档中构建简单的元素层次结构.

全局类型

使用全局类型,您可以在文档中定义单个类型,所有其他引用都可以使用该类型.例如,假设您想要为公司的不同地址概括人和公司.在这种情况下,您可以定义一般类型如下 :

<xs:element name = "AddressType">
   <xs:complexType>
      <xs:sequence>
         <xs:element name = "name" type = "xs:string" />
         <xs:element name = "company" type = "xs:string" />
      </xs:sequence> 
   </xs:complexType>
</xs:element>

现在让我们在我们的示例中使用此类型,如下所示 :

<xs:element name = "Address1">
   <xs:complexType>
      <xs:sequence>
         <xs:element name = "address" type = "AddressType" />
         <xs:element name = "phone1" type = "xs:int" /> 
      </xs:sequence> 
   </xs:complexType>
</xs:element> 

<xs:element name = "Address2">
   <xs:complexType>
      <xs:sequence>
         <xs:element name = "address" type = "AddressType" />
         <xs:element name = "phone2" type = "xs:int" /> 
      </xs:sequence> 
   </xs:complexType>
</xs:element>
而不是必须两次定义名称和公司(一次用于 Address1 ,一次用于 Address2 ),我们现在有一个单一的定义.这使得维护更简单,即,如果您决定将"邮政编码"元素添加到地址,则需要在一个地方添加它们.

属性

XSD中的属性在元素中提供额外信息.属性具有 name type 属性,如下所示 :

 
< xs: attribute name ="x"type ="y"/>